В чем смысл оператора нулевого условия в PowerShell?

PowerShell 7 недавно вышел из экспериментальной стадии Нулевой условный (?.) оператор. Немного поигравшись с этим и прочитав примеры по ссылке выше, я думаю, что понял, как это работает. В следующем примере, если $a не равно нулю и имеет свойство с именем PropName, будет возвращено значение $a.PropName или же будет возвращено значение null.:

$a = @{ PropName = 100 }
${a}?.PropName # ==> 100

Однако я не понимаю, почему я должен использовать новый оператор с нулевым условием вместо доступа к свойствам объекта с помощью точки (.). В приведенном ниже примере отображается одно и то же в обоих случаях, и он не выдает и не подавляет явным образом какие-либо ошибки:

точка

@{ PropName = 100 },
@{ PropNumber = 8675309 } | Foreach-Object {
  Write-Host ( $null -ne $_.PropName ? "PropName has a value of $($_.PropName)" : 'PropName is $null' )
}

# 1st iteration ==> PropName has a value of 100
# 2nd iteration ==> PropName is $null

Null-Conditional (обратите внимание на тонкое изменение)

@{ PropName = 100 },
@{ PropNumber = 8675309 } | Foreach-Object {
  Write-Host ( $null -ne ${_}?.PropName ? "PropName has a value of $(${_}?.PropName)" : 'PropName is $null' )
}

# 1st iteration ==> PropName has a value of 100
# 2nd iteration ==> PropName is $null

Итак, я понимаю, когда это нужно использовать, но в PowerShell уже есть решение для этого с более простым синтаксисом. Я думаю, грубо говоря, в чем смысл этого оператора? Я не могу найти много документации по этому оператору, кроме того, на что я ссылался выше, и я предполагаю, что мне что-то не хватает. Существует аналогичный оператор для массивов (?[]), чтобы условно вернуть элемент массива или $null, если индекс выходит за границы, но опять же, PowerShell уже возвращает $null без ошибок, если вы выходите за границы массива и пытаетесь получить доступ к свойству. .


person Bender the Greatest    schedule 01.04.2021    source источник


Ответы (1)


Я понял разницу примерно через 30 секунд после того, как отправил это. Мое тестирование выше проверяет только члены Property и не принимает во внимание методы или строгий режим. Но вместо того, чтобы удалять вопрос, я думаю, что это полезно объяснить.

По умолчанию свойства не выдают ошибок, если они не существуют в объекте, но вы обязательно получите ошибку InvalidOperation, если попытаетесь выполнить метод для объекта $null. И строгий режим полностью отбрасывает большую часть моего примера с точечным доступом, так как строгий режим выдает ошибки при попытке точечного доступа к любому члену объекта с нулевым значением (среди других дополнительных ограничений в место).

Короче говоря, операторы ?. и ?[] очень полезны, если у вас есть объекты с методами или если вы используете PowerShell в строгом режиме. В противном случае в любом из этих случаев вам придется написать больше шаблонного кода, чтобы сначала выполнить нулевые проверки.

person Bender the Greatest    schedule 01.04.2021