Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala构造函数模式与提取器模式匹配_Scala_Pattern Matching - Fatal编程技术网

Scala构造函数模式与提取器模式匹配

Scala构造函数模式与提取器模式匹配,scala,pattern-matching,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

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

差异在规范中表示:

抽取器模式
x(p1,…,pn)
where
n≥ 0
的属性相同 作为构造器模式的语法形式。然而,不是一个案例 类中,稳定标识符
x
表示具有成员的对象 与模式匹配的名为unapply或unplyseq的方法

简言之,构造函数模式讨论case类的分解,提取器模式讨论具有
unapply
unplyseq
的任何对象

List[A]
有一个由摘要
SeqFactory
提供的
unallyseq

/** 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)

第二个示例将使用
List.unplyseq()
方法

有一个有用的解释:

在应用最广泛的形式中,提取器的作用与 构造函数:后者从给定的 参数,提取器从中提取对象的参数 创建时传递给它

Scala库包含一些预定义的提取器,我们将 马上看一看其中一个。案例类是特殊的,因为 Scala会自动为它们创建一个伴生对象:一个singleton 对象,该对象不仅包含用于创建新 case类的实例,但也是一个unapply方法–the方法 这需要由对象实现,以便使其成为 提取器


《新手指南》没有讨论模式之间的差异。它只表示提取器存在,并且case类自动获取提取器。此外,它也没有讨论提取器,因为规范在区分具有
unapply
和case类的任意对象方面起到了作用。