Scala之::的研究
阿新 • • 發佈:2018-12-25
一個很細節的問題,簡單總結一下。::
在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/ olonNil
和::
, 而既然它是一個case calss,那麼自動實現了unaplly方法的::自然可以順其自然地參與到模式匹配中,進而就是我們看到的寫法n :: rest
,它會匹配一個非空集合,結合的第一個元素被提取並賦給變數n, 剩餘集合被提取並賦予變數rest.
參考: