2016-12-26 5 views
1

scala unapply 메서드를 이해하려고합니다.스칼라 unapply 메서드

다음은 제 이해입니다. 나는 Person 객체가 있다면 말 :

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" 
} 

나는 경우를 가정이 호출 뭔가 같은 :

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" 
} 

적용되지 않는 메소드에서 fname ("Magic")의 값에 어떻게 액세스하고 첫 번째 것과 동일한/올바른 결과를 주나요?

+0

마술입니다! 진지하게, 그것이 "어떻게 작동하는지"에 대해 많이 이해하지 않습니다. 스칼라 컴파일러는'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를 호출 (그래서 그것이 매치했다), 튜플의 원소들 중 하나가 기대 값과 같은지 검사하고, 그렇다면이 경우를 위해 클로저와 일치한다.

관련 문제