2017-03-06 70 views
2

構造函數模式與抽取器模式匹配有什麼區別? 在Scala中編程作者提出的區別作爲構造圖案在第15章所討論的和在26章構造函數模式與抽取器模式匹配

構造圖案的實施例的提取器圖案:提取器的

abstract class Expr 
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr 

expr match { 
    case BinOp("+", e, Number(0)) => println("a deep match") 
    case _ => 
} 

實施例:

l match { 
    case List(a,b,c) => a 
    case _ => 
} 

回答

3

的差在本說明書中表示爲:

提取模式x(p1, …, pn)其中n ≥ 0與 是相同的構造函數模式的句法形式。然而,穩定標識符x代替 類別的情況而不是 類別的情況下表示的對象,該對象具有名爲unapply或unapplySeq的成員 方法,其匹配模式

簡單地說,一個構造圖案會談約case類的分解,其中,所述提取器圖案談到任何對象與任一種或unapplyunapplySeq

List[A]具有由抽象SeqFactory提供一個unapplySeq

/** This method is called in a pattern match { case Seq(...) => }. 
* 
* @param x the selector value 
* @return sequence wrapped in an option, if this is a Seq, otherwise none 
*/ 
def unapplySeq[A](x: CC[A]): Some[CC[A]] = Some(x) 
1

你的第二個例子將使用List.unapplySeq()方法。

The Neophytes' Guide to Scala有一個有用的解釋:

在其最廣泛的應用形式,提取具有 一個構造的相反的作用:當後者從 參數給定的列表中創建一個對象,提取提取創建傳遞給它的對象的參數。

斯卡拉圖書館包含一些預定義的提取器,我們將 很快看看其中之一。案例類是特殊的,因爲 Scala會自動爲它們創建一個伴隨對象:一個單例 對象,其中不僅包含用於創建案例類的新 實例的apply方法,而且還包含不適用方法 - 需要實施的方法 通過一個對象爲了使它成爲一個 提取器。

+0

Neophytes指南並沒有提到模式之間的區別。它只是表明提取器存在,並且案例類自動獲取它們。另外,在規範的意義上,它並不談論提取器,以區分具有'unapply'和case class的任意對象。 –