gpt4 book ai didi

Scala 匹配和引用相等性检查

转载 作者:行者123 更新时间:2023-12-02 14:27:51 25 4
gpt4 key购买 nike

根据变量类型,Scala 有时匹配值,有时不匹配。这个简单的程序说明了这个问题:

class NotEqualToAnything {
override def equals(obj: Any): Boolean = false
}

val x = new NotEqualToAnything()
x match {
case `x` =>
println("WTF x equal to itself")
case _ =>
println("no-match") // This got printed
}

val y: AnyRef = new NotEqualToAnything()
y match {
case `y` =>
println("WTF y equal to itself") // This got printed
case _ =>
println("no-match")

当变量的类型为 AnyRef 时,生成的代码包含对 BoxesRunTime.equals 的调用,它确实执行 y == y 检查在调用 y.equals(y) 之前。当变量的类型为 NotEqualToAnything 时,我们得到标准的 x == null 检查两次,然后调用 x.equals(x).

我对此进行了测试

Scala 2.13.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_201).

我想知道这是否是一个编译器错误,并且是否应该报告这是否是“期望的”行为。在我看来,这两种情况应该表现相同。

一个假设是,编译器希望类在重写 equals 时遵循约定,因此希望 equals 具有反射性 (x.equals(x) = = true)。有人可以证实情况确实如此吗?

最佳答案

a contract for equalsx.equals(x) 必须为 true。如果你违反了这个契约,很多依赖它的东西将不再起作用。

编译器(例如集合库)必须假设对象是“行为良好”的。如果不这样做的话,如果出现问题,那么这不是编译器错误。

这样做的结果是编译器可以在需要时优化一些东西。在本例中,当已知静态类型不需要时,可以跳过 BoxesRunTime.equals 开销。

关于Scala 匹配和引用相等性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58025695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com