पर पारित होने पर प्रो को निष्पादित किया जाता है प्रश्न यह प्रश्न this one से प्रेरित है। जिस स्थिति में है कि ब्लॉक Proc
में बदल जाती है`instance_exec`
Proc::new
केवल एक संलग्न ब्लॉक के साथ एक विधि के भीतर एक ब्लॉक के बिना कहा जा सकता है,:
Proc::new
एक विकल्प के लिए एक विधि के अंदर एक ब्लॉक के बिना के नाम से जाना है वस्तु।
proc
/lambda
उदाहरण एक कोड ब्लॉक के रूप में पारित कर दिया जाता है, तो Proc
का नया उदाहरण बन जाता है किया जा रहा:
Proc.singleton_class.prepend(Module.new do
def new(*args, &cb)
puts "PROC#{[block_given?, cb, *args].inspect}"
super
end
end)
Proc.prepend(Module.new do
def initialize(*args, &cb)
puts "INIT #{[block_given?, cb, *args].inspect}"
super
end
def call(*args, &cb)
puts "CALL #{[block_given?, cb, *args].inspect}"
super
end
end)
λ = ->(*args) { }
[1].each &λ
#⇒ [1]
एक देख सकते हैं, न Proc::new
करने के लिए कॉल हुआ, और न ही Proc#initialize
और/या Proc#call
कहा जाता था।
सवाल यह है: कैसे रूबी हुड के नीचे एक ब्लॉक रैपर बनाता है और निष्पादित करता है?
नायब में pry
/irb
सांत्वना ऊपर कोड का परीक्षण मत करो: वे इस बात का शुद्ध निष्पादन के साथ खामियों के लिए जाना जाता है, मूल रूप से, क्योंकि वे पैच procs।
रूबी का संस्करण? – fl00r
@ fl00r एमआरआई 2.1-2.3, मुझे वास्तव में विश्वास है कि सभी संस्करण यहां पर कार्य कर रहे हैं। – mudasobwa
मैं आपका आउटपुट 'रूबी 2.2.2p95 (2015-04-13 संशोधन 50295) प्राप्त नहीं कर सकता [x86_64-darwin14] 'मुझे मिला [1]। प्रत्येक &λ; => [1]' – fl00r