Где создавать классы динамически?Внутри объекта или глобального пространства имен? - PullRequest
1 голос
/ 08 августа 2010

Я создаю классы без пространства имен динамически.

Я видел пример, где это создание выполняется в классе 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

Мои вопросы:

  • Вы также оцените это в контекстеобъекта?
  • В чем отличие создания классов в глобальном пространстве имен?
  • Какие-либо преимущества или недостатки?

1 Ответ

2 голосов
/ 08 августа 2010

Интересно. После некоторых экспериментов вызов SomeConstant.const_set из разных контекстов не имеет никакого значения, поэтому вызов его внутри блока class Object аналогичен определению его в пространстве имен верхнего уровня.

Более того: все в глобальном пространстве имен неявно определено в классе Object, поэтому оно фактически избыточно. Единственное преимущество, которое я вижу [по сравнению с определением в другом классе или в модуле ядра], заключается в том, что константа будет доступна для всех классов, и цепочка поиска будет смотреть на класс Object перед модулем Kernel .

...