2011-12-29 14 views
7

के लिए :: का उपयोग करते हुए मामले इस पैटर्न मैच को देखते हुए:स्केला मैच सूचियों

List(1,2,3) match { 
    case head :: tail => println(">>> head=" + head) 
} 

मुझे लगता है कि यह सोचते हैं हूँ '::' मामले वर्ग scala.collection.immutable में पाया है, लेकिन कैसे 'है :: 'उस फॉर्म में लिखा जाने की अनुमति है (इंफिक्स नोटेशन)? - क्या इसके लिए अनुमति देने के लिए कोई विशिष्ट नियम है?

धन्यवाद

+2

आप [इन्फिक्स ऑपरेटर पर स्कैला मैच अपघटन] (http://stackoverflow.com/questions/1022218/scala-match-decomposition-on-infix-operator) को देखना चाह सकते हैं। और [यह मामला वर्ग कैसे मेल खाता है वैकल्पिक काम कर रहे हैं?] (http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working) – 4e6

उत्तर

25

तुम भी लिख सकते हैं:

val head :: tail = List(1, 2, 3) 

मूल रूप से कुछ भी है, जहां एक पैटर्न की उम्मीद है (एक काम, एक match बयान या एक के लिए-समझ में एक पंक्ति) एक निकालने है, जो ले जा सकते हैं unapply विधि वाली इकाई के रूप में परिभाषित किया गया है।

सिंटैक्टिक चीनी के टुकड़ों में से एक जो स्केल आपको प्रदान करता है वह है; यदि आपके पास एक्स्ट्रेक्टर X(a, b) है, तो इसे a X b के रूप में लिखा जा सकता है।

scala> case class X(a: Int, b: String) 
defined class X 

scala> val a X b = X(1, "two") 
a: Int = 1 
b: String = two 

ऐसी इकाइयों इन्फ़िक्स प्रकार के लिए प्रदान के रूप में अच्छी तरह से लिखने की क्षमता:

scala> type MappedTo[A, B] = Map[A, B] 
defined type alias MappedTo 

scala> def foo(m: Int MappedTo String) = m foreach println 
foo: (m: MappedTo[Int,String])Unit 

नोट है कि न तो मामले में, करता है यहाँ मामला वर्गों (जो एक डिफ़ॉल्ट निकालने के लिए) के साथ एक उदाहरण है स्केल इस तरह के इंफिक्स ऑपरेटरों को प्रतीकात्मक पहचानकर्ताओं को प्रतिबंधित करता है

2

स्काला वास्तव में एक अपरिवर्तनीय वर्ग :: जो गैर खाली सूची (Nil के लिए पूरक) का प्रतिनिधित्व करता है। कक्षाओं के लिए एक इंफिक्स नोटेशन है (जो A <:< B काम जैसी चीजें भी हैं) जो आपको के बजाय head :: tail लिखने की अनुमति दे रहा है। चूंकि :: एक केस क्लास है, तो इसका डिफ़ॉल्ट unapply है जो case कार्य करता है जैसा आप दिखाते हैं।

संबंधित मुद्दे