Ruby 模块内定义的类的回调

Ruby 模块内定义的类的回调,ruby,metaprogramming,Ruby,Metaprogramming,Ruby已经有好几个了。这种情况有没有回电?有点像你添加的方法,但是对于模块中的类(或常量),而不是类中的实例方法。据我所知,没有什么与你所描述的完全一样。但是,下面是如何使用Class::inherited创建自己的 module MyModule def self.class_added(klass) # ... handle it end class ::Class alias_method :old_inherited, :inherited def

Ruby已经有好几个了。这种情况有没有回电?有点像你添加的方法,但是对于模块中的类(或常量),而不是类中的实例方法。

据我所知,没有什么与你所描述的完全一样。但是,下面是如何使用
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

您可以通过定义自己的
def_类
方法来尝试这种方法:

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!"

是的,类的补丁方法有它自己的问题。特别是,对于任何定义自己回调且不调用super的类,都不会调用inherited。另一种方法是使用parsetree修改语法树(目前所有情况下都是1.9)。但是,这些回调似乎不见了。我问是因为Gregor的帖子很老了,而文档中没有提到这样的功能。这是一个很好的破解。使用parse tree hack,甚至可以在不需要用户更改自己的模块的情况下执行此操作。但解析树黑客将引入另一个范围。或者引入另一个类似于自定义模块的方法。不完美。我知道Matz不想增加更多的回调,但有些确实缺少。