【问题标题】:Where to create classes dynamically? Within Object or global namespace?在哪里动态创建类?在对象或全局命名空间内?
【发布时间】:2010-08-07 20:16:41
【问题描述】:

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

我看到了一个在 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 的上下文中对此进行评估?
  • 与在全局命名空间中创建类有什么区别?
  • 有什么优点或缺点吗?

【问题讨论】:

    标签: ruby reflection metaprogramming


    【解决方案1】:

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

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

    【讨论】:

    • 啊,好吧。关于你的最后一句话:我的问题是在Object 中定义它是否比顶级命名空间更有利。所以无论如何,它对所有班级都可用。因此,底线是:没有区别(因为全局命名空间意味着隐含的对象命名空间)。
    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多