Powershell 'x or y' 赋值

Powershell 'x or y' assignment

有几种语言提供默认或逻辑或赋值机制:

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:] 且不牺牲可读性?

PowerShell 赋值中没有 || 短路运算符,也没有与 Perl 的 // "defined-or" 运算符等效的东西 - 但您可以构造一个简单的 null coalesce 模仿,例如所以:

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

或者,如果你只想 return 任何可以计算为 $true 的东西,就像你的第一个例子:

$a = ?? $b $c -Truthy

减少这种情况的简单方法:

$a = if ($b -ne $null) { $b } else { $c }

将使用 true 和 false 只是 1 或 0 的事实,并且可以像这样用作数组索引:

$a =  @($c, $b)[$b -ne $null]