2017-03-06 21 views
2

コンストラクタパターンと抽出パターンマッチングの違いは何ですか?抽出のScalaのコンストラクタパターン

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 _ => 
} 

例:コンストラクタパターンをCH 15およびCH 26で抽出パターンコンストラクタパターンの

例で説明されたようにスカラ著者でプログラミングで は区別を行います:

l match { 
    case List(a,b,c) => a 
    case _ => 
} 

答えて

3

差は、本明細書に表される:

n ≥ 0コンストラクタパターンと同一 構文形式である抽出パターンx(p1, …, pn)。しかし、代わり場合 クラスで、安定した識別子xパターンに一致部材 適用を解除という名前のメソッドまたはunapplySeqを持つオブジェクトです。

単に、抽出パターンが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

は、初心者ガイドでは、パターンの違いについて話しません。エクストラクターが存在することを伝えるだけで、ケースクラスはそれらを自動的に取得します。また、 'unapply'クラスとcaseクラスを持つ任意のオブジェクトを区別するための仕様では、エクストラクタについては言及していません。 –