3

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

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

然后注释“7”:

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

如果空值检查不查看 RHS,我希望 null==anything 总是评估为假......但我尝试了一下,并且 null==null 评估为真。

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

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

4

2 回答 2

2

原因是==AnyRef 是如何实现的

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

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

于 2012-09-28T11:37:15.750 回答
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)

(Note that this is a Java snippet so == in the above line means Java's reference equality.)

于 2012-09-28T11:38:53.737 回答