2012-01-31 40 views
15

Có phương pháp thống nhất nào để thực hiện bình đẳng với việc kiểm tra kiểu không? Thật không mayScala bình đẳng với kiểm tra loại?

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

toán tử bình đẳng == không phàn nàn nếu objectB là đối tượng Int while whileA là một chuỗi. Tôi sẽ cần một nhà điều hành như === mà thực hiện kiểm tra kiểu là tốt (và tôi hy vọng nó là thống nhất cho tất cả các scala obj). Liệu toán tử đó tồn tại?

Trả lời

14

Bạn cần phải nhìn vào scalaz 's === cho loại an toàn bằng - nó thực hiện như kiểu lớp đó.

Bạn cũng có thể xem talk bởi Heiko Seeberger, nơi ông mô tả cách nó thực hiện:

http://days2011.scala-lang.org/node/138/275

Bạn cũng có thể tìm thấy một số ví dụ ở đây:

http://scalaz.github.com/scalaz/scalaz-2.9.1-6.0.4/doc.sxr/scalaz/example/ExampleEqual.scala.html#24187

(trong ví dụ họ đang sử dụng phương pháp , nhưng chỉ đơn giản là bí danh cho ===)

+0

có, nó là rất dễ dàng, tôi đã thực hiện một mình – Matroska

8

Scalaz cung cấp toán tử như vậy.

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

này cũng được cung cấp bởi thư viện 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

scala Dotty có một tính năng gọi là Multiversal Equality cho phép gõ an toàn.

Dưới đây là ví dụ về REPL dotty;

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 là một trình biên dịch thế hệ tiếp theo cho Scala - http://dotty.epfl.ch/#getting-started

Các vấn đề liên quan