2017-03-06 85 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的任意对象。 –