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
без ошибок, если вы выходите за границы массива и пытаетесь получить доступ к свойству. .