Scala构造函数模式与提取器模式匹配
构造函数模式和提取器模式匹配之间的区别是什么? 在Scala编程中,作者进行了区分,因为第15章讨论了构造函数模式,第26章讨论了提取器模式 构造函数模式的示例: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
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)
wheren≥ 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类的任意对象方面起到了作用。