回调模块内定义的类

时间:2010-11-16 04:24:05

标签: ruby metaprogramming

Ruby已经有几个built-in callbacks。这种情况有回调吗?有点像method_added,但对于模块内的类(或常量),而不是类中的实例方法。

2 个答案:

答案 0 :(得分: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 :(得分: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!"