scala中的null值相等,odersky book的解释似乎与scala代码不同?

时间:2012-09-28 11:13:13

标签: scala null equality

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

  

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

然后注意“7”:

  

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

如果null检查没有查看RHS,我期待null ==任何事情只是总是评估为false ...但我尝试了,并且null == null计算结果为真。

这本书基于scala 2.8。语言是否在某些时候发生了变化,或者我只是错过了解这个解释?

在我使用的drools引擎中,==被解释为如果LHS为空,并且RHS不为空,则来自RHS的equals方法将通过LHS。即使最合理的equals方法应该在null上返回false,我喜欢drools引擎处理它的方式。在SQL中,我习惯于null!= null。

2 个答案:

答案 0 :(得分:2)

原因是== is implemented in AnyRef

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

eq是一种检查两个变量是否引用同一个对象的方法,因此在这个案例中null == null两个eq null检查片段的第三行都返回true。

答案 1 :(得分:2)

在我看来,引用的文字只说明如果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代码段,因此上面一行中的==表示Java的引用相等。)