2011-02-28 20 views
9
Son zamanlarda Ekstraktörler ile oynamak oldum

eşleşen ve Liste presi özellikle bu nasıl çalıştığını merak:anlama desen listeleri

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

Tamam :: desende kullanılan, bu yüzden derleyici olduğunu tahmin edilmektedir şimdi :: - Nesnede unapply yöntemini arar. Bunu denedim:

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

Bu işe yarıyor. Ancak bu yapmaz:

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

yapar iken:

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

Aslında ben şu anda biraz şaşkınım. Derleyici burada unapply'ın doğru uygulamasını nasıl seçer?

cevap

9

Maç temelde aşağıdaki yapıyor:

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

(List(1,2,3).isInstanceOf[::[Int]]true olduğu için) buna güvenli olduğunu bilir kez.

+0

Ve derleyici bunu dener çünkü :: Listenin bir alt türü nedir? Güncelleme: Ah anladım ^^. – raichoo

+1

@raichoo - Bunu deniyor çünkü desende '::' diye soruyorsunuz. –

+0

Evet, yine de öyle. Bunu açıkladığın için teşekkürler :) – raichoo