【发布时间】:2012-04-17 05:55:57
【问题描述】:
有人能解释一下为什么PowerShell中的等式运算符不是对称关系吗?
PS> "" -eq 0
False
PS> 0 -eq ""
True
【问题讨论】:
标签: powershell
有人能解释一下为什么PowerShell中的等式运算符不是对称关系吗?
PS> "" -eq 0
False
PS> 0 -eq ""
True
【问题讨论】:
标签: powershell
是的,PowerShell 中的-eq 不是等价关系。虽然理论家此时可能会惊恐万分,但这主要是为了让语言更好地传达思想并更易于理解。
例如,PowerShell always 尝试将二进制运算符中的不同类型转换为 left 操作数的类型,这就是您在问题中看到该行为的原因。在实践中,我发现这几乎不是问题,除了人为的例子。在我自己的数据中,我通常会编写与匹配类型的比较,并且在处理其他数据时,转换通常不会有害,因为它们会破坏含义。在这种情况下,我认为语言的可预测性比获得数学理想更重要(考虑到计算机中的数字只是数学实体的近似值,这在任何地方都无法实现)。
另一件事是,如果比较运算符(-eq、-gt、-lt、-ge、-le、-match...)的左操作数是一个集合,那么运算符返回集合中运算符将产生 true 的所有项目。在这种情况下,您可以快速过滤集合而不需要 where,但是我想真正的优势是您可以编写条件 if ($foo -gt 4),这可能意味着两者 »if @ 987654330@ 是一个大于 4 的标量值« 或者 »如果 $foo 是一个包含大于 4 项的集合« 而无需将管道插入if。
【讨论】:
-eq 在绝大多数情况下都按预期工作,并进行了一些调整,使某些情况更简单。您的问题指出的是 PowerShell 如何转换操作数的选择,但与 -eq 本身无关。对于+ 或-lt,它的工作原理相同。在我看来,它可预测地的工作方式比它的运作方式更重要。
== 总是尽可能将操作数转换为数字,即使它们是恰好包含数字的字符串。
x+y >= x 这样的东西可能是假的,即使x 和y 都是非负数。这是一个混乱的世界,我们必须凑合;-)。不过,在这种情况下,语言设计者并没有因为偏离了不同的方向而成为彻头彻尾的白痴。至少在我看来 ;-)
这是 PowerShell 尝试转换类型然后进行比较的方式。
检查一下:
$false -eq ""
这也返回 True。
【讨论】:
我的第一个猜测是,在第一种情况下,右手操作数从 0 转换为“0”(左手操作符的类型是字符串),因此“”不等于“0” ”。第二种情况,有“”到int的转换,“”被认为是0。
试试 3 + ""
【讨论】:
当你做"" -eq 0时,它和"".equals(0)一样,它返回false。
0 -eq "" 将尝试将 "" 转换为 in 并且 [int]"" 为 0,因此你得到 true。
【讨论】:
"" -eq 0 会首先将0 转换为"0"。
$false -eq [bool]$null怎么会返回True和$false -eq $null返回False?