का उपयोग करती है, मैं रूबी के विशेष $&
(returns last regex match) का उपयोग करने वाली विधि को उपनाम करने की कोशिश कर रहा हूं। मैं मैन्युअल रूप से कर सकते हैं और यह काम करता है:
original = String.instance_method(:sub)
String.send(:define_method, :sub) do |*args, &block|
puts "called"
original.bind(self).call(*args, &block)
end
"foo".sub(/f/) { $&.upcase }
called
# => "Foo"
लेकिन अगर मैं एक विधि है कि मेरे लिए यह करता है लिखने की कोशिश है, यह विफल रहता है:
def programatic_alias(klass, method_name)
original = klass.instance_method(method_name)
klass.send(:define_method, method_name) do |*args, &block|
puts "called"
original.bind(self).call(*args, &block)
end
end
programatic_alias(String, :sub)
"foo".sub(/f/) { $&.upcase }
called
NoMethodError: undefined method `upcase' for nil:NilClass
called
called
called
from (irb):19:in `block in irb_binding'
यह वैश्विक राज्य की तरह लग रहा से प्रभावित किया जा रहा है programatic_alias
विधि का दायरा, लेकिन मुझे यकीन नहीं है कि यह क्या हो रहा है। प्रश्न यह हैं: मैं String#sub
प्रोग्रामेटिक रूप से उपनाम कैसे कर सकता हूं ताकि यह रूबी के विशेष वैश्विक चर के साथ काम कर सके?
माणिक के किन संस्करणों रहे हैं आप उपयोग कर रहे हैं? 2.2.1 के साथ मेरे लिए आपका उदाहरण काम कर रहा है। –
मैं रूबी 2.2.2 का उपयोग कर रहा हूं। आपको यह सुनिश्चित करने की ज़रूरत है कि आप विभिन्न स्क्रिप्ट/आईआरबी सत्रों में उदाहरण चलाएं अन्यथा आप पहले परिभाषित विधि उपनाम का उपयोग कर रहे हैं। मैंने अपनी स्थानीय मशीन पर 2.2.1 पर कोशिश की, समस्या को पुन: पेश करने में सक्षम था। – Schneems
आप '$ और' वैश्विक चर का उपयोग क्यों करेंगे? – hakcho