Scala равенство с проверкой типа?
Существует ли единый метод выполнения равенства с проверкой типов?
К сожалению
val objectA:String = "test"
val objectB:Int = 2
objectA == objectB
оператор равенства == не жалуется, если objectB является Int, а objectA - строкой.
Мне нужен оператор вроде ===, который также выполняет проверку типов (и я надеюсь, что он будет равномерным всем scala obj). Существует ли такой оператор?
Ответы
Ответ 1
Вам нужно посмотреть scalaz === для безопасных типов - он реализуется как класс типа.
Вы также можете посмотреть разговор Heiko Seeberger, где он описывает, как он реализован:
http://days2011.scala-lang.org/node/138/275
Здесь вы также можете найти несколько примеров:
http://scalaz.github.com/scalaz/scalaz-2.9.1-6.0.4/doc.sxr/scalaz/example/ExampleEqual.scala.html#24187
(в примерах используется метод ≟
, но он просто псевдоним для ===
)
Ответ 2
Scalaz предоставляет такой оператор.
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._
scala> 4 === "Scala"
<console>:14: error: type mismatch;
found : java.lang.String("Scala")
required: Int
4 === "Scala"
^
scala> 4 === 4
res7: Boolean = true
scala> 4 === 5
res8: Boolean = false
Ответ 3
Это также предоставляется библиотекой ScalaUtils:
import org.scalautils.TypeCheckedTripleEquals._
scala> "Scala" == Some("Scala")
res1: Boolean = false
scala> "Scala" === Some("Scala")
<console>:11: error: types String and Some[String] do not adhere to the type
constraint selected for the === and !== operators; the missing implicit
parameter is of type org.scalautils.Constraint[String,Some[String]]
"Scala" === Some("Scala")
^
Ответ 4
scala dotty (он же scala 3) имеет функцию, называемую Multiversal Equality, которая обеспечивает безопасное равенство типов.
Ниже приведен пример с точечным REPL;
scala> val data1 = "string"
val data1: String = "string"
scala> val data2 = Array(1, 2, 3, 4)
val data2: Array[Int] = [[email protected]
scala> val comparisonBool = data1 == data2
1 |val comparisonBool = data1 == data2
| ^^^^^^^^^^^^^^
| Values of types String and Array[Int] cannot be compared with == or !=
Dotty - это компилятор следующего поколения для Scala - http://dotty.epfl.ch/#getting-started
Замечания:
Когда выйдет scala 3?
Намерение состоит в том, чтобы опубликовать финальную версию Scala 3.0 вскоре после Scala 2.14. В текущем графике выпуска (который все еще может измениться) это означает начало 2020 года.