由于发明人强调Scala的类型安全我不明白对象上缺少 equals 方法(至少从案例类) 允许仅检查具有相同类型的对象的相等性。我希望有一个方法===
默认情况下实现此行为。当然,Java 的互操作性需要有一个可以与Any
类型,但在很多情况下我只想检查相同类型的对象之间的相等性。
为什么我需要它?
例如,我有两个案例类并从中创建对象
case class Pos(x: Int, y: Int)
case class Cube(pos: Pos)
val startPos = new Pos(0, 0)
val cubeOnStart = new Cube(startPos)
后来我需要检查几次位置并且写错了
if (startPos == cubeOnStart) {
// this code will never be executed, but unfortunately this compiles
}
但意思是
if (startPos == cubeOnStart.pos) {
// this code can be executed if positions are equal
}
如果有一个方法===
我会凭直觉使用它。
为什么缺少这样的方法有充分的理由或解释吗?
Scala 中的平等是一团糟,答案是你的why问题(Stack Overflow 并不是真正理想的场所)是“因为语言设计者认为 Java 的互操作性胜过在这种情况下做合理的事情”。
至少在 Scala 的最新版本中startPos == cubeOnStart
将导致警告,指出比较这些不同类型的值“将始终产生 false”。
The 斯卡拉兹图书馆 https://github.com/scalaz/scalaz提供了===
您正在通过类型安全寻找的运算符Equal
类型类。你会写这样的东西:
import scalaz._, Scalaz._
implicit val cubeEqual = Equal.equalA[Cube]
implicit val posEqual = Equal.equalA[Pos]
Now startPos === cubeOnStart
不会编译(这正是我们想要的),但是startPos === cubeOnStart.pos
将会,并将返回true
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)