2011-02-28 7 views
9
요즘 추출기와 주변 놀았 던

에 일치하고 목록 추출기 특히이 작동하는 방법 궁금 :이해 패턴 목록

List(1, 2, 3) match { 
    case x :: y :: z :: Nil => x + y + z // case ::(x, ::(y, ::(z , Nil))) 
} 

확인 :: 패턴에 사용되는, 그래서 컴파일러는 추측됩니다 이제 :: - Object에서 적용되지 않는 메소드를 찾습니다. 그래서 이것을 시도 :

scala> (::).unapply(::(1, ::(2, Nil))) 
res3: Option[(Int, List[Int])] = Some((1,List(2))) 

좋은 작품. 그러나이되지 않습니다

scala> (::).unapply(List(1,2,3))  
<console>:6: error: type mismatch; 
found : List[Int] 
required: scala.collection.immutable.::[?] 
     (::).unapply(List(1,2,3)) 

을이가하는 동안 :

scala> List.unapplySeq(List(1,2,3)) 
res5: Some[List[Int]] = Some(List(1, 2, 3)) 

사실 나는 순간에 조금 의아해 해요. 컴파일러는 여기서 어떻게 적용 취소의 올바른 구현을 선택합니까?

답변

9

매치는 기본적으로 다음을 수행한다 :

(::).unapply(List[Int](1,2,3).asInstanceOf[::[Int]]) 

을 (List(1,2,3).isInstanceOf[::[Int]]true 때문에) 안전 것을 알고 한 번.

+0

그리고 컴파일러는 :: 왜냐하면 :: List의 하위 유형입니까? 업데이트 : 아, 알았어. ^^. – raichoo

+1

@raichoo - 패턴에서'::'를 요구하기 때문에 시도합니다. –

+0

그렇습니다. 그 명확한 주셔서 감사합니다 :) – raichoo