在哪里动态创建类?在Object或全局命名空间内?

时间:2010-08-07 20:16:41

标签: ruby reflection metaprogramming

我正在动态创建非命名空间的类。

我已经看到了一个在Object类中完成此创建的示例:

class Object

  for elem in ARRAY
    sub_class = Object.const_set(elem.to_s.camelize, Class.new(SuperClass))

    sub_class.class_eval do
      def initialize(*args, &block)
        ...
        super *args, &block
      end
    end
  end

end

我的问题:

  • 您是否也会在Object的上下文中对此进行评估?
  • 在全局命名空间中创建类的区别在哪里?
  • 有什么优点或缺点?

1 个答案:

答案 0 :(得分:2)

有趣。经过一些实验,从不同的上下文调用SomeConstant.const_set没有任何区别,因此在class Object块中调用它与在顶层命名空间中定义它是一样的。

此外:全局命名空间中的所有内容都在Object类中被隐含地定义,因此它实际上是多余的。我可以看到[在不同的类或内核模块中定义它]的唯一优势是,常量将可用于所有类,查找链将查看Object类之前的Kernel类1}}模块。