2013-02-24 20 views
13
def test 
    "Hello World" 
end 

p method(:test).call #"Hello World" 
p method("test").call #"Hello World" 

मेरा प्रश्न है: क्या होता है जब हम call विधि के प्रतीक को पास करते हैं? रूबी प्रतीक को एक स्ट्रिंग में परिवर्तित कर देगा और फिर इसे निष्पादित करेगा? यदि हां, तो इसका उद्देश्य क्या है?रूबी विधि को समझना #call

और यदि नहीं, तो वास्तव में क्या होता है? क्या आप विस्तृत कर सकते हैं? क्षमा करें अगर मैं खुद को स्पष्ट करने में विफल रहता हूं।

+0

जो कुछ भी करता है वह आंतरिक रूप से सी में रूबी के लिए किया जाता है। इससे कोई फर्क नहीं पड़ता। – sawa

उत्तर

14

जब आप किसी भी स्पष्ट वर्ग या मॉड्यूल परिभाषा के def test ... बाहर निष्पादित, आप वस्तु वर्ग के संदर्भ में अनिवार्य रूप से कर रहे हैं, तो test अब Object

irb में का एक उदाहरण विधि है ...

1.8.7 :001 > def test 
1.8.7 :002?> "Hello world" 
1.8.7 :003?> end 
=> nil 
1.8.7 :004 > Object.instance_methods.sort 
=> ["==", "===", "=~", "__id__", "__send__", "class", "clone", "display", "dup", "enum_for", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "inspect", "instance_eval", "instance_exec", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "methods", "nil?", "object_id", "private_methods", "protected_methods", "public_methods", "respond_to?", "send", "singleton_methods", "taint", "tainted?", "tap", "test", "to_a", "to_enum", "to_s", "type", "untaint"] 

methodObject वर्ग का एक उदाहरण विधि है जो अनिवार्य रूप से सब कुछ विरासत में प्राप्त होता है। जब आप किसी भी स्पष्ट वर्ग या मॉड्यूल परिभाषा के बाहर method पर कॉल करते हैं, तो आप अनिवार्य रूप से इसे Object वर्ग की विधि के रूप में आमंत्रित कर रहे हैं, और वह वर्ग स्वयं Class का उदाहरण है, जो Object का उप-वर्ग है (क्षमा करें - मुझे पता है कि यह एक है थोड़ा उलझन में पालन करने के लिए)।

तो - method विधि एक स्ट्रिंग या प्रतीक लेती है और उसी ऑब्जेक्ट पर उस नाम की बाध्य विधि को encapsulating ऑब्जेक्ट देता है जो .method पर कॉल किया गया था। इस मामले में, test विधि Object ऑब्जेक्ट से जुड़ी है।

method(:test).call का अर्थ है testObject की विधि जिसे आप def test ... के माध्यम से पहले परिभाषित करते हैं।

+0

@MisterCal irb कंसोल से, 'Object.class' => कक्षा। –

+0

आह! हटाए गए। मैंने इस तथ्य के आधार पर एक धारणा की है कि ऑब्जेक्ट कक्षा का एक सुपरक्लास है। मैं अब देखता हूं, थोड़ी उलझन में हाहा। – MisterCal