2009-05-29 7 views
27

Ruby Programming Language में बनाम, अध्याय 6 (दूसरा पैराग्राफ) वे राज्य:रूबी कार्यों तरीकों

कई भाषाओं काम करता है, जो कोई संबद्ध वस्तु है, और विधियों, जो एक रिसीवर पर लागू कर रहे हैं के बीच अंतर वस्तु। चूंकि रूबी पूरी तरह ऑब्जेक्ट उन्मुख भाषा है, सभी विधियां सही तरीके हैं और कम से कम एक ऑब्जेक्ट से जुड़े हैं।

और फिर 6 अनुच्छेद के मध्य में:

दोनों procs और lambdas कार्यों बजाय तरीकों एक वस्तु पर लागू कर रहे हैं।

मैं इन बयानों के बारे में थोड़ा उलझन में हूं। क्या रूबी वास्तव में शुद्ध ओओ है, और इसलिए ऐसे कार्य नहीं हैं जो वस्तुओं से जुड़े नहीं हैं (यदि यह शुद्ध ओओ की वैध परिभाषा है), या प्रो ऑब्जेक्ट से जुड़े procs/lambdas हैं? रुबी में कार्यों और विधियों के बीच क्या अंतर है?

पार्सिंग और समझने में कोई भी मदद की सराहना की जाएगी।

उत्तर

21

lambda एस रूबी में वर्ग प्रो की वस्तुएं हैं। Proc ऑब्जेक्ट्स किसी ऑब्जेक्ट से संबंधित नहीं हैं। उन्हें किसी ऑब्जेक्ट पर बाध्य किए बिना बुलाया जाता है।

विधियां या तो Method या UnboundMethod की वस्तुएं हैं, भले ही वे बाध्य हों या अनबाउंड हों। स्पष्टीकरण here देखें। अनबाउंड विधियों को तब तक नहीं बुलाया जा सकता जब तक वे किसी ऑब्जेक्ट से बंधे न हों।

lambda{|x| x}.class  # => Proc 
lambda{|x| x}.call(123) # => 123 

class Foo 
    def bar(baz) 
    baz 
    end 
end 

puts Foo.new.method(:bar).class  # => Method 
puts Foo.new.method(:bar).call(123) # => 123 

puts Foo.instance_method(:bar).class  # => UnboundMethod 
puts Foo.instance_method(:bar).call(123) # => throws an exception 

आप bind एक एक वस्तु को UnboundMethod और फिर इसे कॉल कर सकते हैं। लेकिन आप किसी ऑब्जेक्ट पर bindProc नहीं कर सकते हैं। Proc ऑब्जेक्ट्स आसपास के दायरे में स्थानीय चर को पकड़ सकते हैं, बंद हो जाते हैं।

5

प्रोसेस और लैम्बडा call विधि के साथ दोनों ऑब्जेक्ट्स हैं जो वास्तव में proc (या लैम्बडा) से जुड़े ब्लॉक को आमंत्रित करते हैं। हालांकि, रूबी call पर स्पष्ट कॉल के बिना उन्हें आमंत्रित करने के लिए कुछ वाक्य रचनात्मक चीनी प्रदान करता है।

+0

हां, proc और lambdas प्रो ऑब्जेक्ट्स दोनों हैं, लेकिन उनका मतलब क्या है "विधियों के बजाय कार्य हैं।" और भेद क्या है? –

+0

उनका मतलब है कि 6 वें पैराग्राफ के बीच में वाक्य गलत है। –

+1

अंतर वास्तव में है कि, लगभग सार्वभौमिक रूप से, procs और lambdas का उपयोग केवल उनके संबंधित 'कॉल' विधि के लिए किया जाता है। कोई भी उनके साथ अतिरिक्त विधियों या मूल्यों को स्टोर नहीं करता है। तो, जैसे कप्तान कोल्ड कहते हैं, हम उनका उपयोग कर सकते हैं क्योंकि हम अन्य भाषाओं में पहले ऑर्डर फ़ंक्शंस का उपयोग करेंगे, भले ही वे अभी भी वास्तव में ऑब्जेक्ट्स हों। – rampion

5

मुझे लगता है कि भेद विधियों और first order function यानी के बीच है। कार्यों के रूप में चारों ओर पारित किया जा सकता है।