12

有几种语言提供默认或逻辑或分配机制:

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

4

2 回答 2

9

PowerShell 赋值中没有||短路运算符,也没有与 Perl 的//“定义或”运算符等效的东西 - 但您可以构造一个简单的null 合并模仿,如下所示:

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
于 2018-07-24T22:31:07.600 回答
4

所以一个简单的方法来减少这个:

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

将使用 true 和 false 只是 1 或 0 的事实,并且可以用作数组索引,如下所示:

$a =  @($c, $b)[$b -ne $null]
于 2018-07-25T09:26:44.673 回答