Ruby already has several built-in callbacks. Is there a callback for such case? Kinda like method_added, but for classes (or constants) inside a module, instead of instance methods inside a class.
Ruby已经有几个内置的回调。这种情况有回调吗?有点像method_added,但对于模块内的类(或常量),而不是类中的实例方法。
2 个解决方案
#1
4
As far as I know, there is nothing exactly like what you're describing. However, here's how you could create your own, using Class::inherited
.
据我所知,没有什么与你所描述的完全一样。但是,这是使用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
#2
1
You could try this approach, by defining your own def_class
method:
您可以通过定义自己的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!"
#1
4
As far as I know, there is nothing exactly like what you're describing. However, here's how you could create your own, using Class::inherited
.
据我所知,没有什么与你所描述的完全一样。但是,这是使用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
#2
1
You could try this approach, by defining your own def_class
method:
您可以通过定义自己的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!"