2016-12-26 12 views
1

スカラ未適用メソッドを理解しようとしています。Scala未適用メソッド

以下は私の理解です。

val temp = Person.unapply(new Person("Magic", "Mike")) 
if (temp != None) { val (x, y) = temp.get } 
else { <go to next case> } 

が、私は以下のように持っていたときにどのように適用を解除する作業の下に行われます:

new Person("Magic", "Mike") match { 
    case Person("Harold", y) => s"Last Name is ${y}" 
    case Person("Magic", y) => s"Last Name is ${y}" 
    case _ => "Unknown" 
} 

class Person(val fname: String, val lname: String) 

object Person{ 
    def unapply(x: Person) : Option[(String, String)] = 
    Some(x.fname,x.lname) 
} 

new Person("Magic", "Mike") match { 
    case Person(x, y) => s"Last Name is ${y}" 
    case _ => "Unknown" 
} 

この私はケースのようなものを呼び出し推測:私はPersonオブジェクトを持っている場合は言いますそれはunapplyメソッドでfname( "Magic")の値にどのようにアクセスし、最初のものと同じ/正しい結果を返しますか?

+0

それは魔法です!真剣に、 "それがどのように動作するか"についてはあまり理解できません。 Scalaコンパイラは 'Person(foo、bar)'を見て、それを適切な引数で 'Person.unapply'への呼び出しで置き換え、戻り値を検査し、与えられた変数に値を割り当てるか、または与えられた定数と一致させます。 – Dima

答えて

3

-Xprint:patmatscalacを実行すると、パターンマッチングフェーズの後に見てどのように構文木を紹介します:Optionが空でない場合、その後、

scalac -Xprint:patmat test.scala 

    case <synthetic> val x1: Person = new Person("Magic", "Mike"); 
    case10(){ 
    <synthetic> val o12: Option[(String, String)] = Person.unapply(x1); 
    if (o12.isEmpty.unary_!) 
     { 
     <synthetic> val p3: String = o12.get._1; 
     val y: String = o12.get._2; 
     if ("Harold".==(p3)) 
      matchEnd9(scala.StringContext.apply("Last Name is ", "").s(y)) 
     else 
      case11() 
     } 
    else 
     case11() 
    }; 
    case11(){ 
    <synthetic> val o14: Option[(String, String)] = Person.unapply(x1); 
    if (o14.isEmpty.unary_!) 
     { 
     <synthetic> val p5: String = o14.get._1; 
     val y: String = o14.get._2; 
     if ("Magic".==(p5)) 
      matchEnd9(scala.StringContext.apply("Last Name is ", "").s(y)) 
     else 
      case13() 
     } 
    else 
     case13() 
    }; 
    case13(){ 
    matchEnd9("Unknown") 
    }; 

は、あなたが見ることができるように、各ケースの最初のそれが一致したオブジェクトにunapplyを呼び出し(一致しているので)、タプルの要素の1つが期待値と等しいかどうかをチェックし、そうであれば、この場合のクロージャに一致します。

関連する問題