2011-08-07 8 views
8

MRI implementation of gc.c में मैंने undef नामक ऑब्जेक्ट देखा। undef ऑब्जेक्ट क्या है? इसकी कक्षा क्या है? मैं इसे कैसे एक्सेस कर सकता हूं? क्या इसके लिए कोई उपयोगिता है?रूबी की "अनिश्चित" वस्तु क्या है?

+2

मुझे नहीं पता कि यह क्या है, लेकिन संभवतः यह किसी विधि को अपरिभाषित करने के लिए उपयोग की जाने वाली 'अपरिफ' विधि से संबंधित नहीं है। –

+1

@ एंड्रयू ग्रिम, हाँ, मैं सहमत हूं! –

उत्तर

5

यह मेरे हिस्से पर एक शिक्षित अनुमान है, शायद मैटज़ इस प्रश्न को किसी बिंदु पर देखेगा और हमें एक निश्चित उत्तर देगा, उम्मीद है कि यह इस दौरान होगा।

जैसा कि आप जानते होंगे, रूबी कम से कम शुरुआती शुरुआत में कुछ हद तक प्रभावित था (यही कारण है कि हमारे पास $ @ और $ _ आदि जैसे चर हैं)। पर्ल में undef कीवर्ड/फ़ंक्शन है (उदाहरण के लिए यदि आप प्रारंभ किए बिना एक चर घोषित करते हैं - इसका मान अपरिभाषित है)। मैं कहूंगा, कि कुछ समय पहले रूबी में कुछ समान होना था (यानी वेरिएबल्स एक अनिर्धारित मूल्य प्राप्त करने में सक्षम होंगे)। हम इसके बारे में कैसे जानते हैं? जिस संदर्भ में यह पाया जाता है।

जैसा कि आप देख सकते हैं, यह टिप्पणी बताती है कि विभिन्न रूबी ऑब्जेक्ट्स के object_id कैसे व्युत्पन्न होते हैं। उस पर कुछ विवरण here पाया जा सकता है। लेकिन, संक्षेप में हम निम्नलिखित पता:

false.object_id == 0 
true.object_id == 2 
nil.object_id == 4 

यह वही टिप्पणी से पता चलता है और यह वास्तव में मामला है, आप खुले एक irb सत्र दरार और खुद के लिए इसे बाहर की कोशिश कर सकते है। ऐसा लगता है कि undef की तरह का एक object_id 6.

अब है चाहिए था, undef वास्तव में रूबी में एक आरक्षित शब्द है, लेकिन यह एक विशेष वस्तु nil, false और true की तरह, यह है नहीं है - के रूप में हम जानते हैं - एक एक विधि को परिभाषित करने के लिए इस्तेमाल किया गया कीवर्ड।

तो, अपने प्रश्न का उत्तर देने के लिए, undef ऑब्जेक्ट नहीं है, इसमें कोई कक्षा नहीं है और आप इसे एक्सेस नहीं कर सकते हैं। उद्देश्य undef सेवा करने के लिए था, इसके बजाय रुबी में nil ऑब्जेक्ट द्वारा सेवा दी जा रही है जिसे हम आज जानते हैं। लेकिन, यह हमारे द्वारा खोजे जाने और पहेली को खोजने के लिए उत्सुकता के लिए समय की विरासत के रूप में कोड में रहा है।

+0

मैंने पाया कि यह एक ऑब्जेक्ट नहीं है क्योंकि मैं 'ऑब्जेक्टस्पेस._id2ref (6) 'के साथ एक पुनर्प्राप्त नहीं कर सकता। यह [कई स्थानों] पर पाया जाता है (http://rxr.whitequark.org/mri/ident?i=Qundef), और [यहां] (http://rxr.whitequark.org/mri/source/include/ruby/ ruby.h # 352) इसे "प्लेसहोल्डर के लिए अपरिभाषित मान" के रूप में प्रस्तुत किया जाता है।वास्तव में, इसका उपयोग 0, -1, न्यूल इत्यादि के बजाय अपरिभाषित (या शून्य) मानों का प्रतिनिधित्व करने के लिए किया जाता है। किसी भी वैध रूबी ऑब्जेक्ट के साथ संघर्ष से बचने के लिए यह आवश्यक लगता है। एक अच्छा उदाहरण है [हटाए गए इंस्टेंस चर को अमान्य करें] (http://rxr.whitequark.org/mri/source/variable.c#1279)। –

+0

और मूल्यों के बारे में आपके लिंक के लिए +1। धन्यवाद! :) –

+0

उस आखिरी उदाहरण में मुझे ऐसा लगता है कि कुंडफ का उपयोग आवृत्ति चर के मान को ओवरराइट करने के लिए किया जा रहा है जिसे हटाया जा रहा है। यदि आप उस आवृत्ति चर को एक्सेस करने का प्रयास करते हैं तो रूबी को अपवाद फेंकने के लिए यह आवश्यक होना चाहिए। अगर वे क्यूनील का इस्तेमाल करते हैं तो मेरा अनुमान है कि आपको अपवाद नहीं मिलेगा, बल्कि बदले में वापस आने वाले व्यवहार के रूप में वापस आना होगा जो आपके इच्छित व्यवहार नहीं है। बहुत रोचक, मुझे इस बात को लेकर बहुत अच्छा लगा - अच्छा सवाल। – skorks

-2

मुझे पूरा यकीन है कि यह एक अपरिभाषित चर का जिक्र कर रहा है (जैसा कि nil के रूप में परिभाषित चर के विपरीत है)।

इस पर एक नज़र डालें:

def hello(object = 'World') 
    puts "Hello #{object}" 
end 

hello     #=> 'Hello World' 
hello 'stackoverflow' #=> 'Hello stackoverflow' 
hello nil    #=> 'Hello ' 

संपादित करें: अपने प्रश्न के लिए एक अधिक पूरा जवाब के साथ समाप्त करने के लिए। आप कभी भी उस undef ऑब्जेक्ट तक पहुंचने में सक्षम नहीं होंगे। यह केवल विधि परिभाषा में मौजूद है, न कि उसके शरीर में। या तो यह एक डिफ़ॉल्ट मान से भरा हुआ है (जैसे ऊपर 'World') या आपको ArgumentError मिलेगा क्योंकि आपने सभी विधि पैरामीटर निर्दिष्ट नहीं किए हैं।

+0

आह, आपके जवाब को समझने में एक मिनट लगा। किसी विधि पर कोई तर्क नहीं पारित करने और 'शून्य 'पास करने के बीच एक अंतर है। वह अंतर 'undef' ऑब्जेक्ट है। क्या आपके कहने का मतलब यह है? – mikezter

+0

सही, डिफ़ॉल्ट तर्क मान केवल प्राथमिकता लेते हैं यदि सचमुच कोई मान पास नहीं हुआ है। – Koraktor

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