gpt4 book ai didi

scala - 为什么 Scala 没有类型安全的 equals 方法?

转载 作者:行者123 更新时间:2023-12-03 20:18:18 26 4
gpt4 key购买 nike

由于发明者强调 Scala 的类型安全性,我不明白对象(至少从案例类)上缺少 equals 方法,该方法仅允许检查具有相同类型的对象的相等性。我想要一个方法 ===默认情况下实现此行为。当然,对于 Java 互操作性来说,必须有一个与 Any 一起工作的方法。 type 但在许多情况下,我只想检查相同类型的对象之间的相等性。
为什么我需要它?
例如,我有两个案例类并从中创建对象

  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 中的平等是一团糟,你为什么问题的答案(Stack Overflow 并不是真正的理想场所)是“因为语言设计者认为 Java 互操作性胜过在这种情况下做合理的事情”。

至少在 Scala 的最新版本中,您的 startPos == cubeOnStart将导致警告,指出比较这些不同类型的值“将始终产生错误”。

Scalaz library提供 ===您正在通过类型安全查找的运算符 Equal类型类。你会写这样的东西:

import scalaz._, Scalaz._

implicit val cubeEqual = Equal.equalA[Cube]
implicit val posEqual = Equal.equalA[Pos]

现在 startPos === cubeOnStart不会编译(这正是我们想要的),但是 startPos === cubeOnStart.pos将,并将返回 true .

关于scala - 为什么 Scala 没有类型安全的 equals 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19742527/

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