2011-12-29 29 views
7

Với mô hình này phù hợp:scala sánh chữ sử dụng cho các danh sách ::

List(1,2,3) match { 
    case head :: tail => println(">>> head=" + head) 
} 

Tôi giả định rằng '::' là lớp trường hợp tìm thấy trong scala.collection.immutable, nhưng làm thế nào là ':: 'được phép viết ở dạng đó (ký hiệu infix)? - có quy tắc cụ thể nào để cho phép điều đó không?

Cảm ơn

+2

Bạn có thể xem [Phân tách đối sánh Scala trên toán tử kết nối] (http://stackoverflow.com/questions/1022218/scala-match-decomposition-on-infix-operator) và [Làm thế nào là trường hợp này lớp phù hợp với p attern working?] (http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working) – 4e6

Trả lời

25

Bạn thậm chí có thể viết:

val head :: tail = List(1, 2, 3) 

Về cơ bản bất cứ điều gì mà một mô hình dự kiến ​​(chuyển nhượng, một tuyên bố match hoặc một dòng trong một cho-hiểu) có thể mất một vắt, đó là được định nghĩa là một thực thể với phương thức unapply.

Một trong những miếng đường cú pháp mà scala cung cấp cho bạn là; nếu bạn có một bộ giải nén X(a, b), điều này có thể được viết là a X b. Dưới đây là một ví dụ với lớp trường hợp (trong đó có một vắt mặc định):

scala> case class X(a: Int, b: String) 
defined class X 

scala> val a X b = X(1, "two") 
a: Int = 1 
b: String = two 

Khả năng viết các đơn vị này ghi vào kéo dài với các loại cũng như:

scala> type MappedTo[A, B] = Map[A, B] 
defined type alias MappedTo 

scala> def foo(m: Int MappedTo String) = m foreach println 
foo: (m: MappedTo[Int,String])Unit 

Lưu ý rằng trong trường hợp không, không scala giới hạn các toán tử infix đó thành các mã định danh biểu tượng

2

Scala thực sự có một lớp học bất biến :: đại diện cho danh sách không rỗng (các bổ sung cho Nil). Có một ký hiệu infix cho các lớp (cũng giống như cách hoạt động của A <:< B), cho phép bạn viết head :: tail thay vì ::(head, tail). Vì :: là một lớp vỏ, nó có mặc định là unapply làm cho case hoạt động như bạn minh họa.

Các vấn đề liên quan