繁体   English   中英

为什么Scala没有类型安全等于方法?

[英]Why has Scala no type-safe equals method?

由于发明者强调了Scala的类型安全性,我不明白对象(至少从case类 )缺少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中的平等是一个混乱,你的原因问题(Stack Overflow不是真正理想的场所)的答案是“因为语言设计者决定Java互操作性胜过在这种情况下做出合理的事情”。

至少在Scala的最新版本中,你的startPos == cubeOnStart会产生一个警告,说明比较这些不同类型的值“总是会产生错误”。

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

import scalaz._, Scalaz._

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

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

截至2018年,Dotty存在多元化平等 但是,它需要开发人员定义相等检查才有意义的类型。 总而言之,优雅的向后兼容解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM