Можно ли вызвать функцию, вложенную в другую функцию (PowerShell)?

Я очень привык к Python, где функции можно помещать в классы и вызывать отдельно.

Однако теперь мне нужно что-то закодировать в PowerShell, и я не могу найти способ, возможно ли что-то подобное здесь.

Пример того, что я пытаюсь сделать:

function a {
    Write-Host "a"

    function a_1() { Write-Host "a_1" }

    function a_2() { Write-Host "a_2" }
    
}

a      # Works
a.a_1  # Doesn't works
a_2    # Doesn't works

Только если внутренняя функция имеет модификатор области видимости, то есть: function script:a_1() { ... } или function global:a_2() { ... }

Santiago Squarzon 17.05.2022 15:15

Возможно, вы ищете Модули PowerShell; они не позволяют вам использовать функции гнездо таким образом, но они позволяют группировать функции вместе

Jeff Zeitlin 17.05.2022 15:18

Это проблема области действия — функции a_1 и a_2 определены в области действия a и, таким образом, перестают существовать после возврата функции. Вы можете сохранить их в области вызова с помощью оператора вызова . точка-источник: . a; a_1; a_2

Mathias R. Jessen 17.05.2022 15:20
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
3
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

PowerShell (5 и выше) поддерживает классы (см. about_Classes), и методы класса могут быть статическими.

Так, например:

class a {
    a() {
        Write-Host "a"
    }
    static [void]a_1()
    {
        Write-Host "a_1"
    }
    static [void]a_2()
    {
        Write-Host "a_2"
    }
}

[a]$a = [a]::new()
[a]::a_1()
[a]::a_2()

Выход:

a
a_1
a_2

Only if the inner function have a scope modifier, i.e.: function script:a_1() { ... } or function global:a_2() { ... } – Santiago Squarzon

Спасибо! Это кажется достаточно близким к тому, что я ищу, в сочетании с творческим наименованием функций это позволяет получить то, к чему я привык.

Решение для меня:

function a {
    Write-Host "a"

    function script:a.a_1() { Write-Host "a_1" }

    function script:a.a_2() { Write-Host "a_2" }
    
}

a       # Call this so the functions get loaded
a.a_1   # Creative naming so it acts like I need it
a.a_2

На самом деле то, что предложил Матиас, гораздо элегантнее, чем изменение области действия внутренней функции.

Santiago Squarzon 17.05.2022 15:43

Другие вопросы по теме