【问题标题】:Powershell 'x or y' assignmentPowershell 'x 或 y' 赋值
【发布时间】:2019-01-01 15:26:36
【问题描述】:

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

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

【问题讨论】:

  • Here's a good article with an example function。它将= 转换为支持三元和空值合并的函数。
  • 有一个feature request on GitHub 可以将此添加到PowerShell语言中;请在那里发出你的声音。
  • @TheIncorrigible1: 是的:有一个related feature request to add ternary conditionalsWhere-Object是在argument模式下解析的,所以和expression模式没有冲突) .
  • @kfsone:好问题;顺便说一句:为了可靠地测试$null$null 必须用作 LHS - $null -ne $b - 因为 RHS 操作数充当 过滤器在 PowerShell 中使用 数组值 LHS(尝试 'foo', 'bar' -ne $null)。
  • @mklement0 哦,直到!有更多的理由有一个特定的运营商。

标签: powershell ternary-operator null-coalescing-operator powershell-core


【解决方案1】:

在 PowerShell 赋值中没有 || 短路运算符,也没有与 Perl 的 //“定义或”运算符等效的东西 - 但您可以像这样构造一个简单的 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
    }
  }
}

然后使用like:

$a = ?? $b $c

或者,如果您只想返回任何可以评估为$true 的内容,就像在您的第一个示例中一样:

$a = ?? $b $c -Truthy

【讨论】:

【解决方案2】:

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

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

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

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

【讨论】:

  • 这非常简洁,虽然我想我会在 PR 中将其标记为不可读。
  • 不幸的是,我不得不同意@TheIncorrigible1——这是让同事们不再学习 Powershell 的可靠方法:(
猜你喜欢
  • 1970-01-01
  • 2022-12-12
  • 2012-09-28
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2021-08-28
  • 2015-04-11
  • 2014-03-01
相关资源
最近更新 更多