Как мне создать экземпляр класса из строкового имени в ruby? - PullRequest
104 голосов
/ 08 мая 2011

У меня есть имя класса, и я хочу создать экземпляр этого класса, чтобы я мог перебирать каждый атрибут rails, присутствующий в схеме этого класса.

Как мне поступитьделать это?

  1. У меня есть имя в виде строки класса, который я хочу проверить
  2. Я думаю, мне нужно создать экземпляр класса, чтобы я мог
  3. Просмотрите его атрибуты и распечатайте их.

Ответы [ 4 ]

190 голосов
/ 08 мая 2011

В рельсах вы можете просто:

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> 
13 голосов
/ 08 мая 2011

Очень просто в Rails: используйте String#constantize

class_name = "MyClass"
instance = class_name.constantize.new
5 голосов
/ 08 мая 2011

Попробуйте это:

Kernel.const_get("MyClass").new

Затем перебрать переменные экземпляра объекта:

obj.instance_variables.each do |v|
  # do something
end
4 голосов
/ 14 декабря 2013
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.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...