2011-12-29 62 views
7

鑑於這種模式匹配:斯卡拉匹配的情況下使用::對列表

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

我假設「::」是scala.collection.immutable發現的情況下類,但怎麼是「:: '允許用這種形式寫(中綴記法)? - 是否有一個特定的規則允許這樣做?

感謝

+2

您可能想查看[中綴運算符上的Scala匹配分解](http://stackoverflow.com/questions/1022218/scala-match-decomposition-on-infix-operator)和[這個案例如何匹配p attern working?](http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working) – 4e6 2011-12-29 08:55:12

回答

25

,你甚至可以寫:

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

基本上任何其中模式預期(賦值,一個match陳述或線在換理解)可以採取提取,這是定義爲具有unapply方法的實體。

其中一塊句法糖 scala爲您提供的是;如果你有一個提取器X(a, b),這可以寫爲a X b。下面是與case類(其中有一個默認的提取器)的例子:

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 

寫這樣的實體延伸到類型以及能力:

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 

注意,在兩種情況下,不scala將這些中綴運算符限制爲符號標識符

2

斯卡拉實際上有一個不可變類::它代表了非空列表(補到Nil)。有一箇中級的符號(這也是如何工作的A <:< B),它允許你寫head :: tail而不是::(head, tail)。由於::是一個案例類,因此它有一個默認的unapply,這使得case可以像您說明的那樣工作。