2010-08-07 3 views
1

Я динамически создаю классы без имен.Где динамически создавать классы? В пространстве объектов или глобальных имен?

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

Мои вопросы:

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

ответ

2

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

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

+0

А, ладно. Что касается вашего последнего предложения: мой вопрос заключался в том, является ли определение его в «Объекте» выгодным по сравнению с пространством имен верхнего уровня. Так или иначе, он будет доступен для всех классов. Таким образом, нижняя строка: * Нет разницы * (поскольку глобальное пространство имен подразумевает косвенное пространство имен объектов). – crispy

Смежные вопросы