【问题标题】:PowerShell equality operator not a symmetric relation?PowerShell相等运算符不是对称关系?
【发布时间】:2012-04-17 05:55:57
【问题描述】:

有人能解释一下为什么PowerShell中的等式运算符不是对称关系吗?

PS> "" -eq 0
False
PS> 0 -eq ""
True

【问题讨论】:

    标签: powershell


    【解决方案1】:

    是的,PowerShell 中的-eq 不是等价关系。虽然理论家此时可能会惊恐万分,但这主要是为了让语言更好地传达思想并更易于理解。

    例如,PowerShell always 尝试将二进制运算符中的不同类型转换为 left 操作数的类型,这就是您在问题中看到该行为的原因。在实践中,我发现这几乎不是问题,除了人为的例子。在我自己的数据中,我通常会编写与匹配类型的比较,并且在处理其他数据时,转换通常不会有害,因为它们会破坏含义。在这种情况下,我认为语言的可预测性比获得数学理想更重要(考虑到计算机中的数字只是数学实体的近似值,这在任何地方都无法实现)。

    另一件事是,如果比较运算符(-eq-gt-lt-ge-le-match...)的左操作数是一个集合,那么运算符返回集合中运算符将产生 true 的所有项目。在这种情况下,您可以快速过滤集合而不需要 where但是我想真正的优势是您可以编写条件 if ($foo -gt 4),这可能意味着两者 »if @ 987654330@ 是一个大于 4 的标量值« 或者 »如果 $foo 是一个包含大于 4 项的集合« 而无需将管道插入if

    【讨论】:

    • 我不同意它使语言更好地传达想法或更易于理解。相等运算符应该传达相等。如果 .Equals 方法是想要的,那仍然可用。
    • Nacht,问问其他开发人员他们是否知道等价关系是什么。 -eq 在绝大多数情况下都按预期工作,并进行了一些调整,使某些情况更简单。您的问题指出的是 PowerShell 如何转换操作数的选择,但与 -eq 本身无关。对于+-lt,它的工作原理相同。在我看来,它可预测地的工作方式比它的运作方式更重要。
    • PowerShell 就是一次学习概念并重用它们。对操作数如何以及在什么情况下从什么类型转换为什么类型有复杂的规则只会让事情变得混乱。与 PHP 相比,== 总是尽可能将操作数转换为数字,即使它们是恰好包含数字的字符串。
    • 作为运算符不应该先将两个操作数都转换为[bool],然后再进行比较?正如我最近所经历的那样,这对我来说似乎几乎一样简单,并且可以避免大量混乱。并不是所有运算符都在操作发生之前将其操作数转换为相同类型 - 因为某些运算符要求其操作数为不同类型,例如- 包含。
    • 好吧,计算机中很少有数据类型(除了布尔值和大数之外可能没有)遵循数学并且每个都有自己的怪癖(例如环绕(好吧,我认为这只是一个字段 mod 2^x) ,与数字相同的无穷大,不均匀间隔的实数,...)。所以运营商也在那里崩溃,因为像x+y >= x 这样的东西可能是假的,即使xy 都是非负数。这是一个混乱的世界,我们必须凑合;-)。不过,在这种情况下,语言设计者并没有因为偏离了不同的方向而成为彻头彻尾的白痴。至少在我看来 ;-)
    【解决方案2】:

    这是 PowerShell 尝试转换类型然后进行比较的方式。

    检查一下:

    $false -eq ""
    

    这也返回 True。

    【讨论】:

      【解决方案3】:

      我的第一个猜测是,在第一种情况下,右手操作数从 0 转换为“0”(左手操作符的类型是字符串),因此“”不等于“0” ”。第二种情况,有“”到int的转换,“”被认为是0。

      试试 3 + ""

      【讨论】:

        【解决方案4】:

        当你做"" -eq 0时,它和"".equals(0)一样,它返回false。

        0 -eq "" 将尝试将 "" 转换为 in 并且 [int]"" 为 0,因此你得到 true。

        【讨论】:

        • 我认为 "" -eq 0 会首先将0 转换为"0"
        • 如果是这样的话,那$false -eq [bool]$null怎么会返回True$false -eq $null返回False
        猜你喜欢
        • 2011-10-24
        • 2014-10-21
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        相关资源
        最近更新 更多