[英]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.