鑑於這種模式匹配:斯卡拉匹配的情況下使用::對列表
List(1,2,3) match {
case head :: tail => println(">>> head=" + head)
}
我假設「::」是scala.collection.immutable發現的情況下類,但怎麼是「:: '允許用這種形式寫(中綴記法)? - 是否有一個特定的規則允許這樣做?
感謝
鑑於這種模式匹配:斯卡拉匹配的情況下使用::對列表
List(1,2,3) match {
case head :: tail => println(">>> head=" + head)
}
我假設「::」是scala.collection.immutable發現的情況下類,但怎麼是「:: '允許用這種形式寫(中綴記法)? - 是否有一個特定的規則允許這樣做?
感謝
,你甚至可以寫:
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將這些中綴運算符限制爲符號標識符
斯卡拉實際上有一個不可變類::
它代表了非空列表(補到Nil
)。有一箇中級的符號(這也是如何工作的A <:< B
),它允許你寫head :: tail
而不是::(head, tail)
。由於::
是一個案例類,因此它有一個默認的unapply
,這使得case
可以像您說明的那樣工作。
您可能想查看[中綴運算符上的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