1. 程式人生 > >Scala之::的研究

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/c

oloncolon.html。 我們經常使用的List是一個抽象的sealed類,它只有兩個實現類:Nil::, 而既然它是一個case calss,那麼自動實現了unaplly方法的::自然可以順其自然地參與到模式匹配中,進而就是我們看到的寫法n :: rest,它會匹配一個非空集合,結合的第一個元素被提取並賦給變數n, 剩餘集合被提取並賦予變數rest.

參考:

這裡寫圖片描述