2011-09-23 18 views
7

क्या इसे तुरंत चालू होने के बाद रूबी ऑब्जेक्ट की कक्षा को बदलना संभव है, जैसे:क्या रूबी ऑब्जेक्ट की कक्षा को बदलना संभव है?

class A 
end 

class B 
end 

a = A.new 
a.class = B 

या इसी तरह।

(उपरोक्त कोड कक्षा के रूप में नहीं चलाया जाता है केवल पढ़ने योग्य चर)

मुझे पता है कि यह सलाह नहीं दी जाती है, थोड़ा अजीब है, और कुछ ऐसा करने की योजना नहीं है, लेकिन क्या यह संभव है?

+1

क्यों आपको लगता है कि क्या करना चाहते हैं? ([Faq] को याद रखें: "आपको केवल वास्तविक समस्याओं के आधार पर व्यावहारिक, उत्तरदायी प्रश्न ** पूछना चाहिए **) – Mat

+0

आप क्या होने की उम्मीद करेंगे? उसके बाद कक्षा बी के सभी तरीके हैं? क्योंकि तब 'ए = बीन्यू 'ऐसा करेगा। –

+2

यह संभव था: http://www.oreillynet.com/ruby/blog/2007/04/ruby_code_that_will_swallow_yo.html –

उत्तर

6

नहीं, यह रूबी के भीतर से संभव नहीं है।

यह किसी ऑब्जेक्ट के klass सूचक को बदलकर सी विस्तार के भीतर सैद्धांतिक रूप से संभव है, लेकिन यह ध्यान दिया जाना चाहिए कि यह पूरी तरह कार्यान्वयन-विशिष्ट होगा, तत्काल प्रकार के लिए काम नहीं करेगा (यानी आप निश्चित रूप से नहीं कर सकते उदाहरण के लिए फिक्सम की कक्षा बदलें), और विभिन्न तरीकों से उड़ सकता है।

1

सरल जवाब है, नहीं:

NoMethodError: undefined method `class=' for #<A:0x91a758> 

लेकिन आप तरीकों हटा सकते हैं और मॉड्यूल में मिश्रण है और इस तरह इतनी के रूप में एक उद्देश्य यह है कि पूरी तरह से अलग लग रहा है छोड़ने के लिए कर सकते हैं ...

3

जब मैं से बदलने की जरूरत बिल्ट-इन String वर्ग एक कस्टम वर्ग के लिए MyString कहा जाता है, मैं निम्नलिखित के माध्यम से यह किया:

class MyString < String 
    #Class body here 
end 

class String 
    def to_MyS 
    MyString.new self 
    end 
end 

foo = "bar" 
puts foo.class #=> String 

foo = foo.to_MyS 
puts foo.class #=> MyString 
+0

में परिवर्तित हो जाए, यह 'foo'' की श्रेणी को नहीं बदलेगा; यह एक नया नया उदाहरण बनाता है। – zetetic

संबंधित मुद्दे