Назначение 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]