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
Đó 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. –
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
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. –