簡體   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