Tôi chỉ đoán ở đây vì tôi không có chuyên gia scala nhưng theo số documentation cho lớp Bất kỳ trong scala Tôi nghĩ rằng vì null không phải là một đối tượng, nó không lấy được từ Bất kỳ và như như vậy không khớp với trường hợp được liệt kê đầu tiên.
Thêm mẫu mã bên dưới. Nó in "cái gì khác" khi chạy.
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case (i:Int, null) => println("something else %s".format(i))
case _ => println("catch all")
}
Sau khi nghiên cứu thêm, có vẻ như null phải khớp với bất kỳ ý nghĩa nào documentation nói rằng nó mở rộng AnyRef mở rộng Bất kỳ.
EDIT: Giống như mọi người khác đã nói. Trường hợp đầu tiên không phù hợp với mục đích. Nó được chỉ định trong tài liệu.
Nguồn
2010-01-08 01:19:00
Tôi giả sử một/động lực cho sự lựa chọn này là nó phù hợp với hành vi của bytecode "instanceof" trên JVM. –
Điều đó, và để trống thông qua hoàn toàn sẽ hút. Bạn phải có một sự khoan dung vô nghĩa khiêu dâm để đi tìm động lực! – extempore
"Khiêu dâm không khoan dung" hay không, có một lập luận rằng ý nghĩa tự nhiên và đơn giản nhất cho một kiểu mẫu "x: T" là khớp với bất kỳ thành viên nào của loại T. Ví dụ, nó sẽ tránh những sai phạm như "val x: Any = null "- tốt, nhưng" val (x: Bất kỳ, y: Bất kỳ) = (null, null) "- MatchError. Điều đó "hoàn toàn hút" quá. Tôi không nói rằng Scala đã lựa chọn sai, cũng không phải là nó đặc biệt quan trọng cho rằng Scala thành ngữ tránh sử dụng null. –