代码之家  ›  专栏  ›  技术社区  ›  kfsone

PowerShell“x或y”分配

  •  11
  • kfsone  · 技术社区  · 8 年前

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

    a = b || c;
    a = b or c
    a="${b:-$c}"
    a = b ? b : c;
    

    到目前为止,我在PowerShell核心中找到的唯一等价物是非常详细的:

    $a = if ($b) { $b } else { $c }
    

    在某些情况下

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

    是否有更好的选择[编辑:]不牺牲可读性?

    2 回复  |  直到 8 年前
        1
  •  9
  •   Mathias R. Jessen    8 年前

    没有 || 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
    

    或者,如果您只想返回任何已评估的内容 $true 就像你的第一个例子:

    $a = ?? $b $c -Truthy
    
        2
  •  4
  •   Dave Sexton    8 年前

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

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

    将使用这样一个事实:true和false只是一个或零,可以用作数组索引:

    $a =  @($c, $b)[$b -ne $null]
    
    推荐文章