2009-07-08 15 views
7

में सब-क्लासिंग फ़िक्सनम इसलिए मैं समझता हूं कि आपको सीधे फिक्सम, फ्लोट या इंटीजर को उपclass नहीं करना चाहिए, क्योंकि उनके पास # नया तरीका नहीं है। DelegateClass का उपयोग करना हालांकि काम करता प्रतीत होता है, लेकिन क्या यह सबसे अच्छा तरीका है? किसी को भी पता है कि इन कक्षाओं के पीछे क्या कारण नहीं है # नया है?रूबी

मैं एक वर्ग है जो एक Fixnum तरह बर्ताव करता है, लेकिन कुछ अतिरिक्त तरीकों है की जरूरत है, और मैं अपने मूल्य के लिए उदाहरण के लिए वर्ग के भीतर से self के माध्यम से उल्लेख करने के लिए, सक्षम होने के लिए करना चाहते हैं:

class Foo < Fixnum 
    def initialize value 
    super value 
    end 

    def increment 
    self + 1 
    end 
end 

Foo.new(5).increment + 4 # => 10 
+0

हमें बताएं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं (अंतिम लक्ष्य), और हम आपको ऐसा करने का सबसे अच्छा तरीका बताने की कोशिश करेंगे। मुझे नहीं लगता कि उप-वर्गीकरण यहां उपयुक्त है। –

+0

ने प्रश्न को अद्यतन किया। – cloudhead

उत्तर

17

आप बहुत आसानी से एक त्वरित अग्रेषण कार्यान्वयन खुद के सेट कर सकते हैं:

class MyNum 
    def initialize(number) 
    @number = number 
    end 

    def method_missing(name, *args, &blk) 
    ret = @number.send(name, *args, &blk) 
    ret.is_a?(Numeric) ? MyNum.new(ret) : ret 
    end 
end 

तो फिर तुम जो कुछ तरीकों आप MyNum पर चाहते हैं जोड़ सकते हैं, लेकिन आप उन तरीकों में @number पर काम करने के बजाय, की आवश्यकता होगी सीधे सुपर कॉल करने में सक्षम होने के नाते।

+0

हम्म। लेकिन अगर आपने MyNum.new (2) + MyNum.new (3) किया है, तो क्या आपको MyNum इंस्टेंस के बजाय फ़िक्सम वापस नहीं मिलेगा? मुझे लगता है कि आपको MyNum.new –

+0

में @ number.send को लपेटने की आवश्यकता है, मैंने यह सुनिश्चित करने के लिए अपना उत्तर अपडेट किया कि मूल प्रतिक्रिया एक संख्यात्मक होने पर आप एक माइनम वापस कर दें। –

+0

क्या MyNum को कार्यान्वित किया जा सकता है कि MyNum.new (5) == 5 और 5 == MyNum.new (5)? – rcrogers

2

क्या आप फिक्सनम का विस्तार नहीं कर सकते? जैसा ...

class Fixnum 
    def even? 
    self % 2 == 0 
    end 
end 

42.even? 
+1

मैं कर सकता था, लेकिन मैं नहीं चाहता था। साथ ही, फिक्सम के पास # नया नहीं है, और मुझे # प्रारंभ करने के लिए कार्यक्षमता जोड़ने में सक्षम होना चाहिए। – cloudhead

+1

बंदर-पैचिंग सावधानी से उपयोग किया जाना चाहिए। केवल एक विशिष्ट उपयोग मामले के लिए रूबी कोर क्लास को प्रदूषित करने के लिए, खतरनाक हो सकता है। –

4

IIRC, तत्काल मूल्यों के रूप में रूबी भंडार Fixnums प्रमुख क्रियाविधि, शब्द का कम बिट्स से कुछ का उपयोग कर एक Fixnum के बजाय ढेर पर एक वस्तु के सूचक के रूप में यह टैग करने के लिए। यही कारण है कि, 32-बिट मशीन पर, फ़िक्सनम्स पूर्ण शब्द की बजाय केवल 2 9-बिट्स (या जो कुछ भी है) हैं।

इसलिए इसकी वजह से, आप फिक्सनम के एक "उदाहरण" में विधियां नहीं जोड़ सकते हैं, और आप इसे उपclass नहीं कर सकते हैं।

यदि आप "फिक्सनम-जैसी" कक्षा होने पर मृत-सेट हैं, तो आपको शायद एक कक्षा बनाना होगा जिसमें फिक्सनम इंस्टेंस वैरिएबल हो और अग्रेषित विधि उचित तरीके से कॉल करें।

+0

आह मैं देखता हूं। क्या कोई अन्य वर्ग है जो मैं उपclass कर सकता हूं? संख्यात्मक में # नया है, लेकिन यह कोई तर्क नहीं लेता है, इसलिए मुझे लगता है कि यह एक सार वर्ग है। – cloudhead

+0

हम्म। मैंने थोड़ी देर में रूबी को छुआ नहीं है, और मुझे बिल्कुल याद नहीं है कि संख्यात्मक वर्ग का पेड़ कैसे रखा जाता है। –

+0

एकमात्र स्पष्ट उम्मीदवार बिगडेसिमल है। –