2012-01-31 67 views
15

是否有统一的方法来执行与类型检查相等? 不幸的是斯卡拉与类型检查相等吗?

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

相等的==操作符不抱怨,如果对象B是一个诠释,而对象A是一个字符串。 我需要像===这样的运算符来执行类型检查(我希望它对所有的scala obj都是一致的)。这样的操作符存在吗?

回答

14

你需要看的===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

(在例子,他们正在使用方法,但它只是===的别名)

+0

是的,这是很容易的,我已经独自实施 – Matroska 2012-01-31 19:44:00

8

斯卡拉斯提供这样一个操作符。

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

这也是由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") 
        ^
0

斯卡拉疯疯癫癫有一个叫做Multiversal Equality功能,它允许类型安全。

下面是dotty 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 != 

斑点狗是斯卡拉下一代编译器 - http://dotty.epfl.ch/#getting-started