构造函数模式和提取器模式匹配有什么区别? 在 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 _ =>
}
答案 0 :(得分:3)
差异在规范中表示:
提取器模式
n ≥ 0
,其中x
是相同的 句法形式作为构造函数模式。但是,而不是一个案例 class,稳定标识符unapply
表示具有成员的对象 名为unapply或unapplySeq的方法与模式匹配。
简单地说,构造函数模式讨论了案例类的分解,其中提取器模式讨论了具有unapplySeq
或List[A]
的任何对象。
unapplySeq
抽象SeqFactory
提供了/** 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)
:
com.heyho.rest.JSONService
答案 1 :(得分:1)
您的第二个示例将使用List.unapplySeq()
方法。
The Neophytes' Guide to Scala有一个有用的解释:
在其应用最广泛的形式中,提取器具有相反的作用 构造函数:后者从给定的列表中创建一个对象 参数,提取器提取对象的参数 传递给它了。
Scala库包含一些预定义的提取器,我们会 不久就看看其中一个。案例类是特殊的,因为 Scala会自动为它们创建一个伴侣对象:单身人士 不仅包含用于创建新的apply方法的对象 case类的实例,也是一个unapply方法 - 方法 需要由一个对象实现它才能成为一个对象 提取