【问题标题】:equality of nulls in scala, odersky book's explanation seems different from scala code?scala中的空值相等,odersky书的解释似乎与scala代码不同?
【发布时间】:2012-09-20 06:35:25
【问题描述】:

在 Odersky 的《Scala 编程》第二版第 89 页第 5.7 节中,“==”运算符解释为:

“如您所见, == 已经过精心设计,因此您在大多数情况下都能获得所需的相等比较。这是通过一个非常简单的规则完成的:首先检查左侧是否为空,如果不是null,调用equals方法...由于有自动null检查,您不必自己做检查(7)“

然后是注释“7”:

“自动检查不看右边,但任何合理的equals方法如果其参数为null,都应该返回false。”

如果 null 检查不查看 RHS,我希望 null==anything 总是评估为 false...但我尝试了一下,null==null 评估为 true。

本书基于 scala 2.8。语言是否在某个时候发生了变化,还是我只是误解了解释?

在我使用的 Drools 引擎中, == 被解释为如果 LHS 为空,而 RHS 不为空,则来自 RHS 的 equals 方法将传递给 LHS。尽管最合理的 equals 方法应该在 null 上返回 false,但我喜欢 drools 引擎处理这个问题的方式。在 SQL 中,我习惯于 null != null。

【问题讨论】:

    标签: scala null equality


    【解决方案1】:

    在我看来,引用的文字只说明了如果 LHS 不是null 会发生什么,所以这部分没有矛盾。当 LHS 为 null 时会发生什么情况的描述可能在您没有引用的文本的某些部分中,或者它完全丢失了。

    注(7)说明,如果 LHS 不是null,则不对 RHS 进行检查,RHS 只是传递给equals。因此,在比较 someExpression == null 之类的内容时,Scala 首先检查 someExpression 是否不为空,然后调用 someExpression.equals(null)

    我会说 Scala 的 term1 == term2 被转换成 Java 的

    (term1 != null) ? term1.equals(term2) : (term2 == null)
    

    (注意这是一个Java sn-p,所以上一行中的==表示Java的引用相等。)

    【讨论】:

      【解决方案2】:

      原因是,== is implemented in AnyRef.

      final def ==(that: AnyRef): Boolean =
          if (this eq null) that eq null
          else this equals that
      

      eq 是一种检查两个变量是否引用同一个对象的方法,因此在这种情况下,null == nulleq null 在 sn-p 的第三行中都检查返回 true。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多