Функции PowerShell возвращают поведение

Я наблюдаю довольно странное поведение PowerShell. Похоже, пользовательским функциям может потребоваться «оболочка скобок» для оценки, как вы могли бы ожидать. Учитывая простую функцию PowerShell:

function Return-True { return $true }

а затем пример кода для его вызова:

PS C:\> Return-True
True
PS C:\> Return-True -eq $false
True
PS C:\> (Return-True) -eq $false
False

Идеи? Комментарии?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
29 224
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вторая строка не выполняет логическую оценку. Посмотрите, что произойдет, если вы сделаете то же самое со строками.

PS C:\> function Return-True { return "True string" }
PS C:\> Return-True
True string
PS C:\> Return-True -eq "False string"
True string
PS C:\> (Return-True) -eq "False string"
False

Вторая строка просто возвращает значение функции и не выполняет сравнение. Я не совсем уверен, почему происходит такое поведение, но это делает поведение более заметным, чем при использовании логических значений, которые преобразуются в строки «Истина» и «Ложь».

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

Когда PowerShell видит токен Return-True, он идентифицирует его как команду, и до оценки или конца оператора все остальное является аргументом, который передается функции Return-True.

Вы можете увидеть это в действии, если сделаете:

PS > function Return-True { "The arguments are: $args"; return $true }
PS > Return-True -eq $false
The arguments are: -eq False
True

Вот почему все последующие возвращают True, потому что все, что вы видите, - это результат вызова Return-True с различными аргументами:

PS > Return-True -eq $false
True
PS > Return-True -ne $false
True
PS > Return-True -eq $true
True
PS > Return-True -ne $true
True

Использование (Return-True) заставляет PowerShell оценивать функцию (без аргументов).

Если вы воспользуетесь редактором PowerShell V2, вы увидите, что -eq в первом примере синий, потому что это аргумент и -eq во втором примере серый, потому что это оператор

Также в V2 вы можете строго относиться к аргументам с помощью CmdletBinding и param

function Return-True
{
    [CmdletBinding()]
    param()
    return $true
}
Return-True -eq $false

Return-True -eq $false
Return-True : A parameter cannot be found that matches parameter name 'eq'.
At line:7 char:16
+ Return-True -eq <<<<  $false
    + CategoryInfo          : InvalidArgument: (:) [Return-True], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Return-True

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