Можно ли вызвать функцию, вложенную в другую функцию (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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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