[Ruby] Creating class by name
Alexander Bokovoy
a.bokovoy на sam-solutions.net
Вс Мар 28 18:28:19 MSD 2004
On Sun, Mar 28, 2004 at 03:23:52PM +0400, Mikhail Yakshin wrote:
> Приветствую!
>
> Как создать класс по имени? То есть существует некая строка, допустим:
>
> class Klass
> ... something ...
> end
>
> s = 'Klass'
>
> Хочется вызвать конструктор класса Klass, передав ему еще какие-то
> параметры. Пока я вижу только очень кривое решение в виде:
>
> k = eval("#{s}.new(param1, param2, ...)")
>
> которое мне усиленно не нравится. Есть более культурные методы? Возможно
> даже через изменения интерпретатора, какие-то бинарные либы для
> расширенного reflection/objectspace и т.п.
Например, так (в реальной жизни потребует доработок):
require 'pp'
def get_class(s)
c=Kernel
s.to_s.split(/::/).each do |x|
c=c.const_get(x)
end
return c
end
class Foo
def initialize(*args)
PP.pp args
end
end
class Foo
class Bar
def initialize(*args)
args.each do |x|
PP.pp x.class
end
end
end
end
str = "Foo"
new_class = get_class(str).new([1,2],[3,4],[5,6])
another_class = get_class(::Foo::Bar).new({1=>2},3,[4,5])
PP.pp new_class
PP.pp another_class
--
/ Alexander Bokovoy
Samba Team http://www.samba.org/
ALT Linux Team http://www.altlinux.org/
Midgard Project Ry http://www.midgard-project.org/
Подробная информация о списке рассылки Ruby