[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