Следующее эквивалентно ответу @ SimpleLime, просто выраженному по-разному.
def make_class(name, parent=Object)
Object.const_set(name, Class.new(parent))
end
foo = make_class('Foo')
#=> Foo
bar = make_class('Bar', foo)
#=> Bar
bar.superclass
#=> Foo
bar.const_set('YEP', 'Yep!')
Bar::YEP
#=> "Yep!"
bar::YEP
#=> "Yep!"
При желании переменные могут быть разложены на множители.
make_class('Bar', make_class('Foo')).const_set('YEP', 'Yep!')
Bar::YEP
# => "Yep!"
См. Класс:: new и Module # const_set
Динамически создаваемые классы часто используются анонимно (безымянно), в этом случае можно просто написать:
foo = Class.new
bar = Class.new(foo)
bar.const_set('YEP', 'Yep!')
bar::YEP
#=> "Yep!"
иссылаться на классы по переменным foo
и bar
.