2011-02-28 21 views
9

मैं हाल ही में एक्सट्रैक्टर्स के साथ प्रयोग करना किया गया है पर मिलान और सोच रहा था कि कैसे सूची एक्सट्रैक्टर्स काम विशेष रूप से इस:समझौता पैटर्न सूचियों

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

ठीक :: पैटर्न में प्रयोग किया जाता है, इसलिए मुझे लगता है कि संकलक अनुमान अब :: - ऑब्जेक्ट में अनुपयोगी विधि को देखता है। तो इसने कोशिश की:

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

और संकलक यह कोशिश करता है क्योंकि :: सूची का उप प्रकार है? अद्यतन: आह मुझे लगता है कि मुझे यह ^^ मिलता है। – raichoo

+1

@raichoo - यह कोशिश करता है क्योंकि आप पैटर्न में '::' मांगते हैं। –

+0

हां, हालांकि ऐसा है। स्पष्टीकरण के लिए धन्यवाद :) – raichoo