2010-12-22 24 views
11

Tôi đang nghiên cứu một số mã scala và tìm thấy phương pháp này mà vách ngăn tôi. Trong tuyên bố đối sánh, cấu trúc [email protected] là gì? nó có giá trị gì? khi tôi in nó không khác gì tail, nhưng nếu tôi thay nó bằng đuôi, hàm trả về kết quả khác. Ai đó có thể giải thích nó là gì và chỉ cho tôi một nguồn tài nguyên phù hợp để hiểu nó? (Tôi biết tôi có thể tìm kiếm trong google, nhưng không biết phải tìm kiếm gì ..)Scala "match" help

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
    ls match { 
     case Nil => Nil 
     case [email protected](_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f) 
    } 
+0

'@' thường được sử dụng trong chú thích, nhưng tôi không thấy gì giống như ở đây ... –

Trả lời

28

Tôi sẽ gọi nó là "ăn bánh của bạn và có nó quá nhà điều hành". Ở mọi cấp độ trong khớp mẫu, bạn có thể đặt tên một phần (trước @) và giải mã nó thêm nữa (sau @). Ví dụ tưởng tượng bạn muốn để phù hợp với một danh sách với 3 yếu tố này, bạn cần yếu tố thứ hai, nhưng bạn muốn đăng nhập the whole list:

something match { 
    case [email protected](_,elem,_) => log("matching:" + list); elem  
    case _ => error("not found") 
} 

Nếu không có tính năng này, bạn phải viết một cái gì đó giống như

something match { 
    case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem  
    case _ => error("not found") 
} 

Như bạn có thể thấy, chúng ta cần đặt tên cho phần tử thứ nhất và thứ ba, chỉ vì chúng ta cần chúng để có được một danh sách với cùng cấu trúc ở bên phải, đó là bản mẫu. Nó dễ dàng hơn và rõ ràng hơn nhiều nếu bạn có thể cho toàn bộ một cái tên (list), và các phần sâu hơn trong cấu trúc là (elem), khi bạn cần cả hai ở phía bên phải.

+0

Giải thích tuyệt vời. Cảm ơn người đàn ông !! –

8

Trong trường hợp này, danh sách con trở thành biến được đặt tên cho toàn bộ danh sách (_ :: tail). đuôi là, tốt, đuôi của danh sách. Tôi không chắc liệu có tên riêng cho '@' ở đây không.

Tôi không thực sự thấy mục đích của danh sách phụ ở đây, vì bạn chỉ có thể tham chiếu ls trực tiếp.

Tuyên bố từ chối trách nhiệm: Tôi mới sử dụng scala. Tôi hy vọng tôi có quyền này.

+1

Nó giống nhau trong Haskell (và có thể là ML). – delnan

+0

Xin cảm ơn câu trả lời. Cả hai câu trả lời đều giúp tôi hiểu. –

+10

Nó được gọi là "mẫu kết dính" trong tài liệu tham khảo ngôn ngữ. – Debilski