मैंने एक और उत्तर दिया, हालांकि बड़ा अंतर पहले से ही इंगित किया गया था (पूर्वता / बंधन), और इससे मुश्किलों का पता चल सकता है (टिन मैन, और अन्य लोगों ने कहा कि बाहर)। मुझे लगता है कि मेरा उदाहरण एक सामान्य कोड स्निपेट के साथ समस्या दिखाता है, यहां तक कि अनुभवी प्रोग्रामर भी रविवार की तरह नहीं पढ़ते हैं:
module I18n
extend Module.new {
old_translate=I18n.method(:translate)
define_method(:translate) do |*args|
InplaceTrans.translate(old_translate, *args)
end
alias :t :translate
}
end
module InplaceTrans
extend Module.new {
def translate(old_translate, *args)
Translator.new.translate(old_translate, *args)
end
}
end
फिर मैंने कुछ कोड सुशोभित किए ...
#this code is wrong!
#just made it 'better looking'
module I18n
extend Module.new do
old_translate=I18n.method(:translate)
define_method(:translate) do |*args|
InplaceTrans.translate(old_translate, *args)
end
alias :t :translate
end
end
यदि आप {}
यहां पर परिवर्तन करते हैं तो आपको do/end
त्रुटि मिलेगी, यह विधि translate
मौजूद नहीं है ...
ऐसा क्यों होता है, यहां एक से अधिक बातों का उल्लेख किया गया है - पूर्वता। लेकिन यहां ब्रेसेस कहां लगाएं? (@ टिन मैन: मैं हमेशा आपकी तरह ब्रेसिज़ का उपयोग करता हूं, लेकिन यहां ... ओवरसीन)
इसलिए हर उत्तर की तरह
If it's a multi-line block, use do/end
If it's a single line block, use {}
बस गलत है अगर "लेकिन ब्रेस / पूर्वता पर नजर रखें!"
फिर:
extend Module.new {} evolves to extend(Module.new {})
तथा
extend Module.new do/end evolves to extend(Module.new) do/end
(क्या कभी विस्तार का परिणाम ब्लॉक के साथ होता है ...)
तो अगर आप इसका उपयोग करना चाहते हैं / अंत का उपयोग करें:
#this code is ok!
#just made it 'better looking'?
module I18n
extend(Module.new do
old_translate=I18n.method(:translate)
define_method(:translate) do |*args|
InplaceTrans.translate(old_translate, *args)
end
alias :t :translate
end)
end