2011-09-14 15 views
7

मुझे लगता है किfoo (& nil) foo (और "proc नहीं") से अलग तरीके से कैसे व्यवहार करता है?

[1, 2, 3].each(&nil) 

सवालों से बात काटना से पता चला किसी भी त्रुटि नहीं कारण नहीं है - यह सिर्फ एक प्रगणक देता है।

इसके विपरीत,

[1, 2, 3].each(&"") 

TypeError: wrong argument type String (expected Proc) 

को जन्म देती है इसके अलावा, &nil कारणों block_given? झूठी

def block_given_tester 
    if block_given? 
    puts "Block given" 
    else 
    puts "Block not given" 
    end 
end 

block_given_tester(&nil) # => Block not given 

वापस जाने के लिए यह क्योंकि NilClass लागू करता to_proc नहीं है - मैं RDoc जाँच की।

मैं क्यों यह &nil करना अच्छा होगा समझ सकता हूँ, लेकिन मुझे यकीन है कि कैसे इसके पूर्ण हो जाने नहीं कर रहा हूँ। क्या यह nil के तरीकों में से एक है विशेष व्यवहार अन्य वस्तुओं द्वारा साझा नहीं किया गया है?

उत्तर

7

उत्तर रूबी के स्रोत कोड को देखकर पाया जा सकता है।

रूबी 1.8: फ़ाइल eval.c में समारोह block_pass पर

देखो। ध्यान दें कि यह nil विशेष रूप से Proc ऑब्जेक्ट्स (मैक्रो NIL_P) से व्यवहार करता है। यदि फ़ंक्शन को शून्य मान दिया जाता है, तो यह एक खाली ब्लॉक (मुझे लगता है) और रिटर्न का मूल्यांकन करता है। कोड के ठीक बाद यह जांचता है कि ऑब्जेक्ट Proc ऑब्जेक्ट (फ़ंक्शन rb_obj_is_proc) है और अपवाद "गलत तर्क प्रकार (अपेक्षित प्रो") अपवाद बढ़ाता है या नहीं।

रूबी 1.9.2: फ़ाइल vm_insnhelper.c में विधि caller_setup_args पर

देखो। यह to_proc केवल के साथ proc को परिवर्तित करता है यदि यह शून्य नहीं है; अन्यथा, प्रकार रूपांतरण और प्रकार की जांच को छोड़ दिया जाता है।

+0

मुझे लगता है कि आप 1.8 शाखाओं में से एक को देख रहे हैं जो 1.9 शाखाओं में से एक नहीं है। –

+0

हां, यह रूबी 1.8 से है, क्योंकि यह कोड मेरे पास उपलब्ध है। अब मैं रूबी 1.9.2 के लिए कोड डाउनलोड कर रहा हूं यह देखने के लिए कि क्या कुछ बदल गया है या नहीं। –

+1

मैंने रुबी 1.9.2 के लिए अपना जवाब संपादित कर लिया है। –

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