Scala构造函数模式与Extractor模式匹配

时间:2017-03-06 10:10:27

标签: scala pattern-matching

构造函数模式和提取器模式匹配有什么区别? 在 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 _ =>
}

2 个答案:

答案 0 :(得分:3)

差异在规范中表示:

  

提取器模式n ≥ 0,其中x是相同的   句法形式作为构造函数模式。但是,而不是一个案例   class,稳定标识符unapply表示具有成员的对象   名为unapply或unapplySeq的方法与模式匹配

简单地说,构造函数模式讨论了案例类的分解,其中提取器模式讨论了具有unapplySeqList[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方法 - 方法   需要由一个对象实现它才能成为一个对象   提取