【问题标题】:Scala equality with type checking?带有类型检查的Scala相等性?
【发布时间】:2012-02-23 11:06:14
【问题描述】:

是否有一种统一的方法来执行类型检查的相等性? 不幸的是

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

如果 objectB 是 Int 而 objectA 是 String,则相等运算符 == 不会报错。 我需要一个像 === 这样的运算符来执行类型检查(我希望它对所有 scala obj 都是统一的)。这样的运营商存在吗?

【问题讨论】:

    标签: scala operators equality


    【解决方案1】:

    scala dotty(aka scala 3) 有一个名为Multiversal Equality 的功能,它允许类型安全相等。

    下面是 dotty REPL 示例;

    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

    Note:

    scala 3 什么时候出来?

    目的是发布最终的 Scala 3.0 Scala 2.14 之后不久。在当前的发布计划中(可能 仍然在变化),这意味着 2020 年初。

    【讨论】:

      【解决方案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")
                            ^
      

      【讨论】:

        【解决方案3】:

        您需要查看scalaz=== 以了解类型安全的equals - 它在那里实现为类型类。

        您还可以观看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

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

        【讨论】:

        • 有没有办法让编译器对此发出警告?
        【解决方案4】:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-23
          • 2017-01-20
          • 1970-01-01
          • 2020-03-20
          • 2020-04-08
          • 1970-01-01
          • 2012-07-12
          • 2022-12-11
          相关资源
          最近更新 更多