2012-06-25 2 views
2

코드 http://www.scala-lang.org/node/112에서 코드를 시도하고 하나를 던져야하는 것처럼 보이지 않는 무언가에 대해 일치 오류가 나타납니다.스카라 unapply와 일치 오류

이 원래 코드 : 21

object TwiceTest extends Application { 
    val x = Twice(21) 
    x match { case Twice(n) => Console.println(n) } // prints 21 
    val y = 21 
    y match { case Twice(n) => Console.println(n) } // throws scala.MatchError: 21 (of class java.lang.Integer) 
} 

사건 또는 홀수해야 : 난 그냥 홀수를 통과 할 때 발생하는 테스트 몇 줄을 추가

object Twice {        
    def apply(x: Int): Int = x * 2 
    def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z/2) else None 
} 

object TwiceTest extends Application { 
    val x = Twice(21) 
    x match { case Twice(n) => Console.println(n) } // prints 21 
} 

또한 내가 말할 수있는 한 객체의 적용되지 않는 메소드에 의해 처리 될 수 있습니다. 누군가 이것이 왜 그런지 설명 할 수 있습니까?

답변

6
val x = Twice(21) 

같은 뭔가

변경이 x42와 동일 것을 의미

val x = Twice.apply(21) 

과 동일합니다. Twice.unapply(42)Some(21)을 반환합니다. 즉 과 case Twice(21)이 성공적으로 일치합니다.

이 때문에 첫 번째 match 문이 21으로 인쇄됩니다.

Twice.unapply(21)은 (y == 21, 즉 y이 홀수 인 경우) None을 반환합니다. unapply이 어떤 값으로 None을 반환 할 때마다 그 unapply 방법을 사용하는 추출기 개체는 값이 값과 일치하지 않는다고합니다.

match 문과 해당 값이 일치하지 않으면 MatchError이 표시됩니다.

2

unapply 방법으로 처리 중이지만 match은 처리하지 않습니다. unapplyNone을 반환해야하므로 case Twice(n)을 충족하지 못합니다.

21 match { 
    case Twice(n) => println("this won't happen") 
    case x => println("just " + x) 
}