一個很細節的問題,簡單總結一下。::
在Scala裏有兩種含義,一種是List集合的一個方法,用於把一個元素添加到集合的前面;另一種表示一個非空的List集合,往往應用於模式匹配中。本文原文出處: http://blog.csdn.net/bluishglc/article/details/55668192 轉載請註明出處。
第一種用法: List的一個方法,用於在頭部添加新元素
示例代碼
1 :: List(2, 3) = List(2, 3).::(1) = List(1, 2, 3)
這種寫法在Scala裏極爲常見,但是會讓初學者感到困惑:既然::是List的方法,爲什麼List實例出現在了方法右側,而方法參數出現在了左側。原因是:在Scala裏所有以“:”結尾的運算符是右關聯的,其他的運算符都是左關聯的!
參考:
第二種用法:表示一個非空的List,常見於模式匹配
示例代碼
def sum(list: List[Int]): Int = list match {
case Nil => 1
case n :: rest => n + sum(rest)
}
類似上面的寫法在面向集合的模式匹配中很常見:對於n :: rest
這段代碼的工作方式的詳細解釋是: 它等同於::(n, rest)
,此處的::
實際上是一個case class,在Scala API文檔中,關於這個類地址是:http://www.scala-lang.org/api/current/scala/collection/immutable/Nil
和::
, 而既然它是一個case calss,那麼自動實現了unaplly方法的::自然可以順其自然地參與到模式匹配中,進而就是我們看到的寫法n :: rest
,它會匹配一個非空集合,結合的第一個元素被提取並賦給變量n, 剩餘集合被提取並賦予變量rest.
參考: