2012-04-08 18 views
6

Tôi đang cố gắng tìm hiểu điều gì đang diễn ra trên đoạn mã này, cố gắng tìm hiểu xem có điều gì tôi không hiểu hay không. lỗi hoặc unintuitive spec, hãy định nghĩa hai chức năng gần như giống hệt nhau:Trộn các đối sánh đã nhập với trình đối sánh chuỗi cung cấp các hành vi lạ trong Scala

def typeErause1(a: Any) = a match { 
    case x: List[String] => "stringlists" 
    case _ => "uh?" 
} 
def typeErause2(a: Any) = a match { 
    case List(_, _) => "2lists" 
    case x: List[String] => "stringlists" 
    case _ => "uh?" 
} 

bây giờ nếu tôi gọi typeErause1(List(2,5,6)) tôi nhận được "stringlists" vì ngay cả khi nó thực sự là List[Int] với loại tẩy xoá nó không phải là có thể cho biết sự khác biệt. Nhưng kỳ lạ nếu tôi gọi typeErause2(List(2,5,6)) tôi nhận được "uh?" và tôi không hiểu tại sao nó không phù hợp với List[String] như trước đây. Nếu tôi sử dụng List[_] thay vào chức năng thứ hai, nó có thể khớp chính xác, điều này khiến tôi nghĩ đây là một lỗi trong scalac.

Tôi đang sử dụng Scala 2.9.1

+2

Đó là lỗi trong trình khớp - có nhiều vé về nó và nó sẽ hoạt động bắt đầu với Scala 2.10.x. –

+0

bạn có liên kết đến vé để tôi có thể chọn bạn làm câu trả lời không? – ilcavero

+1

Như tôi đã nói, có rất nhiều vé về trận đấu, và tôi thực sự không đặc biệt quan tâm đến săn bắn cho một trong những bao gồm trường hợp cụ thể này. –

Trả lời

1

Đó là một lỗi trong các khớp;?) Các mô hình khớp đang được (đã) rewritten cho 2.10

tôi chỉ kiểm tra với đêm mới nhất và bạn mã hoạt động như mong đợi:

Welcome to Scala version 2.10.0-20120426-131046-b1aaf74775 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_31). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> def typeErause1(a: Any) = a match { 
    |  case x: List[String] => "stringlists" 
    |  case _ => "uh?" 
    | } 
warning: there were 2 unchecked warnings; re-run with -unchecked for details 
typeErause1: (a: Any)String 

scala> def typeErause2(a: Any) = a match { 
    |  case List(_, _) => "2lists" 
    |  case x: List[String] => "stringlists" 
    |  case _ => "uh?" 
    | } 
warning: there were 3 unchecked warnings; re-run with -unchecked for details 
typeErause2: (a: Any)String 

scala> typeErause1(List(2,5,6)) 
res0: String = stringlists 

scala> typeErause2(List(2,5,6)) 
res1: String = stringlists 
Các vấn đề liên quan