9
scala> class A 
defined class A 

scala> class B 
defined class B 

scala> val a: A = new A 
a: A = [email protected] 

scala> a match { 
    | case _: B => println("unlikely") 
    | case _ => println("no match") 
    | } 
no match 

Trong ví dụ trên, trình biên dịch không cho tôi biết một trong các trường hợp không bao giờ có thể khớp? Một ví dụ phức tạp hơn một chút gần đây đã bắt được tôi, dẫn đến những gì cảm thấy giống như một lỗi không cần thiết mà lẽ ra đã bị bắt bởi trình biên dịch.Kiểm tra loại đối sánh tốt hơn trong Scala

Edit:

Chỉ cần được rõ ràng hơn về câu hỏi này. Điều này có thể xảy ra ở Scala không vì lý do nào đó mà tôi không thể nhìn thấy? (Tôi có thể hiểu nếu các loại đã được sử dụng generics và loại tẩy xoá đã gây ra vấn đề nhưng điều này có vẻ khá thẳng về phía trước.) Và nếu điều này là không thể là có lý do chính đáng này không phải là trong Scala? Nếu không thì nó sẽ được thêm vào khi nào? ;)

Trả lời

22

Hiện nay, exhaustiveness và dự phòng việc kiểm tra chỉ được thực hiện đối với mô hình xây dựng trường lớp. Về nguyên tắc, trình biên dịch cũng có thể làm điều này cho một số kiểu mẫu khác. Nhưng nó sẽ phải được xác định trong SLS chính xác những gì các bài kiểm tra được thực hiện. Điều này có vẻ khả thi nhưng không tầm thường, được đưa ra tương tác giữa các lớp mẫu khác nhau. Vì vậy, tóm lại, đó là một trong những lĩnh vực trong Scala sẽ thu lợi từ những đóng góp tiếp theo.

+3

Tuyệt vời! Tôi đi câu trả lời của tôi từ một người đã dạy tôi scala và công khai nó! Thx stackoverflow! – Kami

4

Trình biên dịch không cảnh báo bạn (trong thực tế biên soạn thất bại) nếu bạn sử dụng các lớp học trường hợp:

scala> case class A() 
defined class A 

scala> case class B() 
defined class B 

scala> val a = A() 
a: A = A() 

scala> a match { 
    | case A() => println("A") 
    | case B() => println("B") 
    | case _ => println("_") 
    | } 
<console>:13: error: constructor cannot be instantiated to expected type; 
found : B 
required: A 
     case B() => println("B") 
+0

Rất tiếc, các trường hợp có một số hạn chế và không phải lúc nào cũng phù hợp. Tôi không thể thấy lý do tại sao trình biên dịch không thể tìm ra điều này cho các lớp bình thường. – Dave