2010-11-16 7 views
6

के अंदर परिभाषित कक्षाओं के लिए कॉलबैक पहले से ही built-in callbacks है। क्या इस तरह के मामले में कोई कॉलबैक है? किंडा जैसे method_added, लेकिन कक्षा के अंदर उदाहरण विधियों के बजाय, मॉड्यूल के अंदर कक्षाओं (या स्थिरांक) के लिए।मॉड्यूल

उत्तर

4

जहां तक ​​मुझे पता है, वही कुछ भी नहीं है जो आप वर्णन कर रहे हैं। हालांकि, यहां बताया गया है कि आप Class::inherited का उपयोग करके अपना खुद का निर्माण कैसे कर सकते हैं।

module MyModule 
    def self.class_added(klass) 
    # ... handle it 
    end 
    class ::Class 
    alias_method :old_inherited, :inherited 
    def inherited(subclass) 
     MyModule.class_added(subclass) if /^MyModule::\w+/.match subclass.name 
     old_inherited(subclass) 
    end 
    end 
end 

module MyModule 
    # now add classes 
end 
+0

हाँ, कक्षा के लिए पैच तरीकों का अपना मुद्दे हैं। विशेष रूप से, विरासत में किसी भी वर्ग पर नहीं बुलाया जाएगा जो अपनी कॉलबैक को परिभाषित करता है और सुपर को कॉल नहीं करता है। विकल्प पैरासेट्री के साथ वाक्यविन्यास पेड़ को बदलने के लिए है (हालांकि सभी मामलों पर अब 1.9 नहीं)। लेकिन ऐसा लगता है कि कॉलबैक गायब हैं। मैंने पूछा क्योंकि ग्रेगोर का पद काफी पुराना है, और दस्तावेज़ इस तरह की सुविधा का जिक्र नहीं करते हैं। –

1

आप, इस दृष्टिकोण की कोशिश कर सकते अपनी खुद की def_class विधि को परिभाषित करते हुए:

module M 
    def self.const_missing(name) 
    const_set(name, Class.new) 
    end 

    def self.def_class(klass, &block) 
    class_added(klass.name) 
    klass.class_eval(&block) 
    end 
end 

module M 
    def self.class_added(klass) 
    puts "new class added: #{klass}" 
    end 

    def_class Hello do 
    def hello 
     puts "hello!" 
    end 
    end 
end 

h = M::Hello.new.hello #=> "hello!" 
+0

यह एक अच्छा हैक है। पार्स पेड़ हैक के साथ, उपयोगकर्ताओं को अपने मॉड्यूल को बदलने की आवश्यकता के बिना ऐसा करना भी संभव है। लेकिन पार्स पेड़ हैक एक और गुंजाइश पेश करेंगे। या एक और कस्टम मॉड्यूल की तरह विधि परिचय। अच्छा नहीं। मुझे पता है कि मैट अधिक कॉलबैक नहीं जोड़ना चाहता था, लेकिन कुछ वास्तव में कमी कर रहे हैं। –