Если вы хотите создать класс с динамическим именем, вам придется делать почти то же, что вы сказали. Однако вам не нужно использовать define_method
. Вы можете просто передать блок Class.new
, в котором вы инициализируете класс. Это семантически идентично содержанию class
/ end
.
Помните с const_set
, чтобы быть добросовестным в отношении получателя (self
) в этой области. Если вы хотите, чтобы класс был определен глобально, вам нужно вызвать const_set
в модуле TopLevel (который варьируется по имени и деталям в зависимости от Ruby).
a_new_class = Class.new(Object) do
attr_accessor :x
def initialize(x)
print #{self.class} initialized with #{x}"
@x = x
end
end
SomeModule.const_set("ClassName", a_new_class)
c = ClassName.new(10)
...