Scala之::的研究

一個很細節的問題,簡單總結一下。::在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/colon colon.html。 我們經常使用的List是一個抽象的sealed類,它只有兩個實現類:Nil::, 而既然它是一個case calss,那麼自動實現了unaplly方法的::自然可以順其自然地參與到模式匹配中,進而就是我們看到的寫法n :: rest,它會匹配一個非空集合,結合的第一個元素被提取並賦給變量n, 剩餘集合被提取並賦予變量rest.

參考:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章