Назначение Powershell x или y
Существует несколько языков, которые предоставляют либо по умолчанию, либо по логике или для механизма назначения:
a = b || c;
a = b or c
a="${b:-$c}"
a = b ? b : c;
До сих пор единственным эквивалентом, который я нашел в Powershell Core, является чрезвычайно многословным:
$a = if ($b) { $b } else { $c }
которые в некоторых случаях должны стать
$a = if ($b -ne $null) { $b } else { $c }
Есть ли лучшая альтернатива [edit:], которая не жертвует удобочитаемостью?
Ответы
Ответ 1
Там нет ||
оператор короткого замыкания в назначениях PowerShell и ничего не эквивалентно Perl //
"определенному-или" оператору, но вы можете построить простую нулевую коализацию подражания, например:
function ?? {
param(
[Parameter(Mandatory=$true,ValueFromRemainingArguments=$true,Position=0)]
[psobject[]]$InputObject,
[switch]$Truthy
)
foreach($object in $InputObject){
if($Truthy -and $object){
return $object
}
elseif($object -ne $null){
return $object
}
}
}
Затем используйте:
$a = ?? $b $c
или, если вы хотите просто вернуть все, что было бы оценено как $true
как в первом примере:
$a = ?? $b $c -Truthy
Ответ 2
Итак, простой способ сокращения этого:
$a = if ($b -ne $null) { $b } else { $c }
Было бы использовать тот факт, что true и false являются только одним или нолем и могут использоваться как индекс массива, например:
$a = @($c, $b)[$b -ne $null]