2013-09-08 4 views
13

यह प्रश्न सीधे this one से संबंधित है। लेकिन मैंने इसे मूल समस्या में तोड़ने की कोशिश की और मैं अन्य प्रश्न बॉक्स में और भी टेक्स्ट दर्ज नहीं करना चाहता था। तो यहां जाता है:classmethods को कैसे प्रीपेड करें

मुझे पता है कि मैं कक्षा मॉड्यूल को विस्तारित करके कक्षाओं को शामिल कर सकता हूं और मॉड्यूल # के माध्यम से इसे शामिल कर सकता हूं। लेकिन क्या मैं प्रीपेन्ड के साथ ऐसा ही कर सकता हूं?

वर्ग फू:

class Foo 
    def self.bar 
    'Base Bar!' 
    end 
end 

वर्ग एक्सटेंशन:

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    base.extend(ClassMethods) 
    end 
end 
# prepend the extension 
Foo.send(:prepend, Extensions) 

वर्ग FooE:

require './Foo' 

class FooE < Foo 
end 

और एक साधारण startscript:

require 'pry' 
require './FooE' 
require './Extensions' 

puts FooE.bar 
यहाँ मेरी उदाहरण है

जब मैं स्क्रिप्ट शुरू करता हूं तो मुझे Extended Bar! नहीं मिलता है जैसा कि मैं अपेक्षा करता हूं लेकिन Base Bar!। ठीक से काम करने के लिए मुझे क्या बदलने की ज़रूरत है?

उत्तर

18

समस्या यह है कि यहां तक ​​कि आप मॉड्यूल prepending रहे हैं, हालांकि, अभी भी ClassMethodsextend एड में जा रहा है आप ऐसा कर सकता है आप क्या चाहते हैं पाने के लिए:।

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    class << base 
     prepend ClassMethods 
    end 
    end 
end 

ध्यान दें कि Extensions ही या तो प्रीपेंड किया जा सकता है या Foo में शामिल किया गया। महत्वपूर्ण हिस्सा ClassMethods तैयार कर रहा है।

+0

बहुत अच्छा! बहुत बहुत धन्यवाद। जाहिर है, मुझे नहीं पता था कि क्या विस्तार करता है। – Nessuno

+0

ग्रेट, धन्यवाद ... – Fabio

24

एक सरल संस्करण:

module Extensions 
    def bar 
    'Extended Bar!' 
    end 
end 

Foo.singleton_class.prepend Extensions 
+1

धन्यवाद, जब आप इसे देखते हैं तो बहुत आसान ... – 244an

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