2009-11-13 5 views
14

स्कैला प्रकार Nothing प्रकार पदानुक्रम के नीचे (जैसा कि मैं इसे समझता हूं) का प्रतिनिधित्व करता है, जो प्रतीक den द्वारा भी दर्शाया गया है। यही है, Nothing किसी दिए गए प्रकार का उप-प्रकार है। टाइप सिद्धांत में सैद्धांतिक पृष्ठभूमि के बिना Nothing प्रकार explained well by James Iry के लिए आवश्यकता है!यदि वर्ग पदानुक्रम के नीचे कुछ भी प्रकार नहीं है, तो मैं इस पर किसी भी कल्पनीय विधि को क्यों नहीं बुला सकता?

तो मेरे सवाल है, अगर Nothing हर प्रकार की एक उप-प्रकार है, मैं क्यों नहीं Nothing पर किसी भी प्रकार के तरीकों कॉल कर सकते हैं क्या है? जाहिर है, मैं कुछ भी नहीं कर सकता लेकिन निम्नलिखित संकलन क्यों नहीं करता?

var n: Nothing = _ 

def main(args: Array[String]) { 
    println(n.length) //compile error: value length is not a member of Nothing 
} 
Nothing रूप

निश्चित रूप से String की एक उप-प्रकार इस ठीक होना चाहिए है? ध्यान दें कि निम्नलिखित संकलित बस ठीक है!

var n: Nothing = _ 

def foo(s: String) : Int = s.length 

def main(args: Array[String]) { 
    println(foo(n)) 
} 

करता है:

def main(args: Array[String]) { 
    println(n.asInstanceOf[String].length) 
} 
+0

विचार करने की एक और बात यह है कि 'एन। लम्बाई' में स्कैला के बारे में जानने का कोई तरीका नहीं है कि आप किस विधि के बारे में बात कर रहे हैं - और आपको यह जानना होगा कि इससे पहले कि आप इसके तर्क (या 'यह' तर्क) सही प्रकार है। 'Foo (n)' में यह पहले से ही स्पष्ट है। – Owen

उत्तर

15

जबकि Nothing सब कुछ का एक उप-प्रकार, है ना इनहेरिटAny में उन लोगों को छोड़कर किसी भी विधि करता है। ऐसा इसलिए है क्योंकि Nothing भाषा के कार्यात्मक अंत की ओर अधिक तैयार है। Option और List जैसी चीज़ों के लिए यह आवश्यक है, लेकिन केवल टाइप करें, कक्षा के रूप में नहीं।

यहां ऑब्जेक्ट उन्मुख पृष्ठभूमि से आने वाले लोगों के लिए भेद थोड़ा अजीब है, लेकिन तथ्य यह है कि एक अवधारणा के रूप में उपनिवेश ओओपी से बहुत अलग है। अनुमोदित, ऑब्जेक्ट उन्मुख वास्तव में कुछ रूपों में subtyping का तात्पर्य है, लेकिन विपरीत सच नहीं है। बेंजामिन पिएर्स की प्रकार और प्रोग्रामिंग भाषाएँ भाषा F_< (उच्चारण "एफ उप") प्रस्तुत करने का एक अच्छा काम करता है, जो सबटाइपिंग (लेकिन ओओ नहीं) वाली भाषा का एक न्यूनतम उदाहरण के रूप में कार्य करता है।

अब, वह सब कहा साथ, मैं मानता हूँ कि तथ्य यह है कि Nothing सामान्य विरासत नियमों से प्रतिरक्षा थोड़ा असंगत प्रतीत होता है है। हालांकि, एक सैद्धांतिक दृष्टिकोण से, यह सही समझ में आता है।

2

मैं Nothing किसी भी विधि को स्वीकार कर सकता है, और उन सभी पर एक मानक कार्रवाई करने लगता है (एक अपवाद फेंक)। हालांकि, यह बहुत उपयोगी नहीं होगा।

संकलन त्रुटि पेश करके, संकलक प्रोग्रामर को चेतावनी दे रहा है कि वह जिस प्रकार की सबसे अधिक संभावना नहीं चाहता था, Nothing, किसी भी तरह कोड में किसी निश्चित बिंदु पर अनुमान लगाया गया।

+0

लेकिन मैं कुछ भी नहीं पर 'toString' कह सकता हूं, मैं बस सोच रहा था कि कुछ कुरूपता है जो संकलक के परिप्रेक्ष्य से किसी विशेष मामले के रूप में कुछ भी नहीं मानती है। या क्या मेरा प्रकार-सिद्धांत बहुत भयानक था और जिस तरह से एक प्रकार का समर्थन करता है * और प्रकार स्वयं * –

+0

से संबंधित नहीं है, मुझे लगता है कि विचार जहां संकलित-समय सत्यापन संभव था। यह बदसूरत नहीं है, यह अच्छा है, जब रनटाइम त्रुटि की बजाय आपको एक संकलन-समय मिलता है। –

0

आप Nothing चर पर toString कॉल कर सकते हैं की वजह से यह defintion है:
final trait Nothing extends Any
और toString Any के सदस्य है। मुझे लगता है कि स्कैला कंपाइलर ट्रीट का Nothing केवल टाइप सीमाओं में है और इसे सभी मामलों पर किसी भी अन्य विशेषता की तरह व्यवहार करता है। Nothing के प्रकार के साथ परिवर्तनीय पर किसी भी विधि का आह्वान करना मुझे लगता है कि बहुत अजीब होगा।

+0

लेकिन अभी भी कुछ विशेष उपचार चल रहा है। 'कुछ भी नहीं' के प्रकार * हस्ताक्षर * से, मैं यह नहीं बता सकता कि यह हर दूसरे प्रकार का विस्तार करता है। –

+1

आह तो यह एक विशेषता है, कक्षा नहीं। तो आप केवल उन विधियों को कॉल कर सकते हैं जिन्हें विशेषता द्वारा स्पष्ट रूप से परिभाषित किया गया है। उससे काफ़ी कुछ समझ में आ जाएगा। – jqno

+1

@oxbow_lakes: विनिर्देशन में वर्णित अच्छी तरह से विशेष उपचार इसलिए संकलक इसे विशेष रूप से प्रकार सीमाओं के संदर्भ में मानता है, उदा। प्रत्येक प्रकार के लिए टी निम्नलिखित सत्य है: कुछ भी नहीं <टी <कोई भी, लेकिन इसके अलावा क्यों कंपाइलर को किसी भी विशेष विशेषता का इलाज नहीं करना चाहिए? Spec में इसका कोई संदर्भ नहीं है। –

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