Как создать экземпляр класса из имени строки в ruby?
У меня есть имя класса, и я хочу создать экземпляр этого класса, чтобы я мог пропустить каждый атрибут rails, который присутствует в схеме этого класса.
Как я могу это сделать?
- У меня есть имя как строка класса, который я хочу проверить
- Я думаю, мне нужно создать экземпляр класса, чтобы я мог
- Прокрутите его атрибуты и распечатайте их.
Ответы
Ответ 1
В рельсах вы можете просто:
clazz = 'ExampleClass'.constantize
В чистом рубине:
clazz = Object.const_get('ExampleClass')
с модулями:
module Foo
class Bar
end
end
вы бы использовали
> clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c}
=> Foo::Bar
> clazz.new
=> #<Foo::Bar:0x0000010110a4f8>
Ответ 2
Очень просто в Rails: используйте String#constantize
class_name = "MyClass"
instance = class_name.constantize.new
Ответ 3
Попробуйте следующее:
Kernel.const_get("MyClass").new
Затем, чтобы перебрать переменные экземпляра объекта:
obj.instance_variables.each do |v|
# do something
end
Ответ 4
module One
module Two
class Three
def say_hi
puts "say hi"
end
end
end
end
one = Object.const_get "One"
puts one.class # => Module
three = One::Two.const_get "Three"
puts three.class # => Class
three.new.say_hi # => "say hi"
В ruby 2.0 и, возможно, более ранних версиях Object.const_get
будет рекурсивно выполнять поиск в пространствах имен, таких как Foo::Bar
. Пример выше, когда пространство имен известно заранее и подчеркивает тот факт, что const_get
можно вызывать на модулях напрямую, а не только на Object
.