2012-03-16 28 views
7

यह मैं 1.9.2 रूबी में एक SystemStackError फेंकता ( लेकिन Rubinius में काम करता है):मैं रुबी में फिक्सनम + (प्लस) विधि को फिर से परिभाषित कैसे कर सकता हूं और मूल + कार्यक्षमता को कैसे रख सकता हूं?

class Fixnum 
    def +(other) 
    self + other * 2 
    end 
end 

लेकिन वहाँ + के लिए कोई super है (अन्य त्रुटियों के आधार पर)।

मैं मूल + कार्यक्षमता तक कैसे पहुंच सकता हूं?

+0

रुको, आप यह काम कर रहे हैं जैसा कि आप रुबिनीस में अपेक्षा करते हैं? –

+0

मैंने अभी इसका परीक्षण किया है, रूबिनीस में काम नहीं करता है। ओवरराइड विधि सिर्फ अनदेखा है। –

+2

क्या आप वाकई ऐसा करना चाहते हैं? यह वहां एक पूरी तरह से स्वचालित पैर बंदूक है। –

उत्तर

13

alias_method का उपयोग करें। उपनाम Fixnum के + कुछ और करने के लिए, तो नए + में यह देखें:

class Fixnum 
    alias_method :old_add, :+ 
    def +(other) 
    self.old_add(other) * 2 
    end 
end 
+1

इसके अलावा, ऐसा करने में वास्तव में भ्रमित लगता है मेरे आईआरबी किसी भी तरह, लेकिन वास्तव में सादे रूबी में काम करता है। –

+0

@ निकलासबी। मैं आमतौर पर पहले कुछ मिनटों में संपादन उत्तरों से कोशिश करता हूं और बचना चाहता हूं। और लोग 'ऊर्फ' बनाम 'alias_method' के लिए वाक्यविन्यास को मिश्रित करते हैं। –

+3

@ एंड्रयू: मुझे यह सुनकर आश्चर्य नहीं हुआ है कि * ओवरराइडिंग फ्रीकिन 'इंटीजर एडिशन * आईआरबी के लिए बहुत अच्छी तरह से नीचे नहीं जाता है ... यह एक हैक इतना बुरा है कि मैं शब्दों के माध्यम से इसका वर्णन नहीं कर सकता। –

1

एक और दिलचस्प दृष्टिकोण Fixnum के module_eval विधि करने के लिए एक ब्लॉक पारित करने के लिए किया जाएगा। तो, उदाहरण के लिए:

module FixnumExtend 
    puts '..loading FixnumExtend module' 

    Fixnum.module_eval do |m| 
    alias_method :plus,  :+ 
    alias_method :min,  :- 
    alias_method :div,  :/ 
    alias_method :mult,  :* 
    alias_method :modu,  :% 
    alias_method :pow,  :** 

    def sqrt 
    Math.sqrt(self) 
    end 

    end 

end 

अब, मेरे पूरे एप्लिकेशन FixnumExtend सहित के बाद मैं कर सकते हैं:

2.plus 2 
=> 4 

81.sqrt 
=> 9 

मैं मदद करने के लिए मेरी ओसीआर इंजन हस्तलिखित कोड को पहचान इस दृष्टिकोण का उपयोग कर रहा हूँ। 2/2 से इसका आसान समय है।