2012-03-16 11 views
10

의 경우 (String, String)Pair이 아니기 때문에이 유형에 오류가 발생할 것으로 예상됩니다.왜 형식 오류가 발생하지 않습니까?

대신 false를 입력하면 런타임에 다음 오류가 발생합니다.

scala.MatchError: (foo,bar) (of class scala.Tuple2) 

나는 해체 그것에 일치를 입력 한 다음 Any의 변수에 결과를 할당하고 단지 설탕 겠지,하지만 스칼라는이 비행을 할 수 있습니다 불행한 것 같다.

답변

7

이 코드를 scalac -print과 함께 컴파일하면 어떤 현상이 나타납니다. 당신이 정확하게 가정 할 때, 그것은 패턴 매칭을위한 단지 통사론적인 설탕입니다. 실제로 케이스 클래스는 Tuple2의 수퍼 클래스 인 코드를 컴파일하는 Product를 확장합니다.

val temp6: Product = if (value) 
     new Main$Pair("foo", "bar") 
    else 
     new Tuple2("foo", "bar"); 

을 그리고 패턴 매칭이 적용된다 그것에 : 당신의 가치는 유형 제품의 변수에 할당됩니다

if (temp6.$isInstanceOf[Main$Pair]()) 
{ 
    <synthetic> val temp7: Main$Pair = temp6.$asInstanceOf[Main$Pair](); 
    new Tuple2(temp7.x(), temp7.y()) 
} 
else 
    throw new MatchError(temp6) 

을 그러나 nontheless이 이럴 컴파일해서는 안된다. 이것을 스칼라 메일 링리스트에 게시해야합니다.

+0

이 명령 ('scalac')을 기억해야합니다! – schmmd

+0

알아두면 좋지만 '제품'의 일반적인 상위 유형이 컴파일되는 이유라고 생각하지 않습니다. 나는 이것을 보여주기 위해 나의 예를 바꿨다. 둘 다 여전히 "모두"의 수퍼 유형을 가지고있다. – schmmd

관련 문제