Scala равенство с проверкой типов? - PullRequest
17 голосов
/ 31 января 2012

Существует ли единый метод для выполнения равенства с проверкой типов? К сожалению

val objectA:String = "test"
val objectB:Int = 2
objectA == objectB

оператор равенства == не жалуется, если objectB - это Int, а objectA - это строка. Мне нужен оператор типа ===, который также выполняет проверку типов (и я надеюсь, что он одинаков для всех scala obj). Такой оператор существует?

Ответы [ 4 ]

14 голосов
/ 31 января 2012

Вам нужно взглянуть на scalaz === для безопасных типов - это реализовано там как класс типов.

Вы также можете посмотреть разговор Хейко Зибергер , где он описывает, как это реализовано:

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

(в примерах они используют метод , но это просто псевдоним для ===)

8 голосов
/ 31 января 2012

Скалаз предоставляет такого оператора.

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
2 голосов
/ 22 июня 2015

Это также предоставляется библиотекой 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")
                      ^
1 голос
/ 27 февраля 2018

scala dotty (он же scala 3) имеет функцию, называемую Multiversal Equality , которая обеспечивает безопасное равенство типов.

Ниже приведен пример REPL для DOTTY;

scala> val data1 = "string" 
val data1: String = "string"

scala> val data2 = Array(1, 2, 3, 4) 
val data2: Array[Int] = [I@86733

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 года.

...