के अंदर परिभाषित कक्षाओं के लिए कॉलबैक पहले से ही built-in callbacks है। क्या इस तरह के मामले में कोई कॉलबैक है? किंडा जैसे method_added, लेकिन कक्षा के अंदर उदाहरण विधियों के बजाय, मॉड्यूल के अंदर कक्षाओं (या स्थिरांक) के लिए।मॉड्यूल
Q
मॉड्यूल
6
A
उत्तर
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
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
यह एक अच्छा हैक है। पार्स पेड़ हैक के साथ, उपयोगकर्ताओं को अपने मॉड्यूल को बदलने की आवश्यकता के बिना ऐसा करना भी संभव है। लेकिन पार्स पेड़ हैक एक और गुंजाइश पेश करेंगे। या एक और कस्टम मॉड्यूल की तरह विधि परिचय। अच्छा नहीं। मुझे पता है कि मैट अधिक कॉलबैक नहीं जोड़ना चाहता था, लेकिन कुछ वास्तव में कमी कर रहे हैं। –
हाँ, कक्षा के लिए पैच तरीकों का अपना मुद्दे हैं। विशेष रूप से, विरासत में किसी भी वर्ग पर नहीं बुलाया जाएगा जो अपनी कॉलबैक को परिभाषित करता है और सुपर को कॉल नहीं करता है। विकल्प पैरासेट्री के साथ वाक्यविन्यास पेड़ को बदलने के लिए है (हालांकि सभी मामलों पर अब 1.9 नहीं)। लेकिन ऐसा लगता है कि कॉलबैक गायब हैं। मैंने पूछा क्योंकि ग्रेगोर का पद काफी पुराना है, और दस्तावेज़ इस तरह की सुविधा का जिक्र नहीं करते हैं। –