नल

2010-01-08 14 views
6

के साथ मिलान टुपल मुझे समझ में नहीं आता कि निम्न केस क्यों मेल नहीं खाता है। नल किसी का उदाहरण होना चाहिए, लेकिन यह मेल नहीं खाता है। क्या कोई बता सकता है कि क्या हो रहा है?नल

val x = (2, null) 
x match { 
    case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v)) 
    case _ => println("catch all") 
} 

prints catch all 

धन्यवाद।

उत्तर

9

यह बिल्कुल निर्दिष्ट है।

Type patterns consist of types, type variables, and wildcards. 
A type pattern T is of one of the following forms: 

* A reference to a class C, p.C, or T#C. 
This type pattern matches any non-null instance of the given class. 

यह दिलचस्प है कि इतनी प्रासंगिकता को किसी के सदस्य होने के लिए जिम्मेदार ठहराया गया है। यह हर प्रकार का सदस्य है लेकिन AnyVal और कुछ भी नहीं।

+0

मुझे लगता है कि इस विकल्प के लिए प्रेरणा यह है कि यह JVM पर "exampleof" बाइटकोड के व्यवहार से मेल खाता है। –

+0

वह, और नल के माध्यम से पूरी तरह से चूसना होगा। प्रेरणा की तलाश में जाने के लिए आपके पास एक अश्लील शून्य सहनशीलता होनी चाहिए! – extempore

+0

"अश्लील शून्य सहनशीलता" या नहीं, एक तर्क है कि एक प्रकार के पैटर्न "एक्स: टी" के लिए सबसे प्राकृतिक और सरल अर्थ टाइप टी के किसी भी सदस्य से मेल खाना है। उदाहरण के लिए, यह अनियमितताओं से बच जाएगा जैसे "val x: Any = शून्य "- ठीक है, लेकिन" वैल (एक्स: कोई, वाई: कोई भी) = (शून्य, शून्य) "- MatchError। वह "पूरी तरह से बेकार" भी है। मैं यह नहीं कह रहा हूं कि स्कैला ने गलत विकल्प बनाया है, न ही यह विशेष रूप से महत्वपूर्ण है कि मूर्खतापूर्ण स्कैला शून्य का उपयोग करने से बचाता है। –

1

मैं सिर्फ अनुमान लगा रहा हूं क्योंकि मैं कोई स्केल विशेषज्ञ नहीं हूं लेकिन स्केल में किसी भी वर्ग के लिए documentation के अनुसार मैं सोच रहा हूं कि चूंकि शून्य शून्य नहीं है, यह किसी से और जैसा नहीं है ऐसा पहले सूचीबद्ध मामले से मेल नहीं खाता है।

नीचे कोड नमूना जोड़ना। यह दौड़ते समय "कुछ और" प्रिंट करता है।

val x = (2, null) 
x match { 
    case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v)) 
    case (i:Int, null) => println("something else %s".format(i)) 
    case _ => println("catch all") 
} 

और अधिक शोध करने के बाद ऐसा लगता है अशक्त की तरह किसी भी भावना के साथ मैच चाहिए documentation कहना है कि यह AnyRef जो किसी भी फैली फैली हुई है।

संपादित करें: हर किसी की तरह कहा है। पहला मामला उद्देश्य पर शून्य से मेल नहीं खाता है। यह प्रलेखन में निर्दिष्ट है।

+0

'शून्य 'कक्षा' नल 'का सिंगलटन उदाहरण है। –

+0

यह समझ में आता है। नल के लिए प्रलेखन (http://www.scala-lang.org/docu/files/api/scala/Null.html) कहता है कि यह AnyRef को बढ़ाता है जो किसी को बढ़ाता है, इसलिए ऐसा लगता है कि इसे केस से मेल खाना चाहिए (i: Int, वी: किसी भी)। –

3

निर्दिष्ट के रूप में (स्काला संदर्भ 2.7, खंड 8.2) है कि:

एक वर्ग सी, p.C, या टी # सेल्सियस के लिए एक संदर्भ। इस प्रकार के पैटर्न को दिए गए वर्ग के किसी भी गैर-शून्य उदाहरण को स्वरूपित करता है। ध्यान दें कि कक्षा का उपसर्ग, यह दिया गया है, कक्षा के उदाहरण निर्धारित करने के लिए प्रासंगिक है। उदाहरण के लिए, पैटर्न पी.सी. केवल कक्षाओं के उदाहरणों से मेल खाता है जो थे जो उपसर्ग के रूप में पथ पी के साथ बनाए गए थे।

6

आप कुछ भी के लिए v प्लेसहोल्डर की कोशिश की है?

val x = (2, null) 
x match { 
    case (i:Int, v) => println("got tuple %s: %s".format(i, v)) 
    case _ => println("catch all") 
} 
संबंधित मुद्दे