【问题标题】:Why do parentheses cause assignment to produce a result?为什么括号会导致赋值产生结果?
【发布时间】:2012-11-02 03:18:59
【问题描述】:

考虑一下 PowerShell:

PS> $x = 'y'
PS> ($x = 'y')
y

为什么添加括号会导致值被打印?

编辑:一些更有趣的案例:

 PS> $z = ($x = 'y')
 PS> $z
 y
 PS> $( $x = $y )
 PS> $z = $( $x = $y )
 PS> $z

【问题讨论】:

    标签: powershell


    【解决方案1】:

    括号告诉外壳程序先计算括号内的值,然后打印结果。在您的第一个命令中,它是分配;然而,第二个是一个将被评估并打印结果的命令,即'y'

    更新

    PS> $z = ($x = 'y') # assignment, no print , ($x = 'y') returns 'y'
    PS> $z    
    y
    PS> $( $x = $y ) # this is a voidable expression whose result is discarded when used directly as a statement. so, $( $x = $y ) -eq $null
    PS> $z = $( $x = $y ) # same to above
    PS> $z
    

    “PowerShell in Action”指出子表达式构造和简单括号之间的区别在于如何处理可撤销语句。 ++,--,+=,-= 操作也被视为可撤销语句。

    在简单的括号 () 中,可撤销语句不被丢弃,但在子表达式 $() 中,它们被丢弃。

    【讨论】:

      【解决方案2】:

      具有副作用的表达式在用作语句时通常不会返回其结果。例如:

      PS> $x = $a++
      

      显然,$a++ 必须有一个值才能使其工作。然而:

      PS> if (...) $a++
      

      您不希望它打印出$a 的值。所以结果被丢弃了。

      分组括号会覆盖此行为,并强制将结果返回到管道,即使它是可撤销的:

      PS> ($x = 'y')
      'y'
      

      另一方面,要使不可撤销的表达式无效,请将其转换为 void 或通过管道将其转换为 Out-Null

      PS> mkdir Foo | Out-Null
      PS> [void](mkdir Bar)
      

      资源

      所以问题Why it needs an extra pair of bracket?

      Windows PowerShell Language Specification - 7.1.1 分组括号,但它们不使用“可撤销表达式”术语。

      博文PowerShell ABC's - V is for Voidable Statements

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      相关资源
      最近更新 更多