Come posso creare un’istanza di class da un nome di stringa in ruby?

Ho il nome di una class e voglio creare un’istanza di quella class in modo che possa scorrere l’attributo di ogni rota presente nello schema di quella class.

Come potrei fare per farlo?

  1. Ho il nome come una stringa della class che voglio controllare
  2. Credo di aver bisogno di istanziare un’istanza di class in modo che io possa farlo
  3. Passa attraverso i suoi attributi e stampali.

In rail puoi semplicemente fare:

 clazz = 'ExampleClass'.constantize 

In puro ruby:

 clazz = Object.const_get('ExampleClass') 

con moduli:

 module Foo class Bar end end 

tu userai

 > clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c} => Foo::Bar > clazz.new => # 

Molto semplice in Rails: usa String#constantize

 class_name = "MyClass" instance = class_name.constantize.new 

Prova questo:

 Kernel.const_get("MyClass").new 

Quindi per scorrere le variabili di istanza di un object:

 obj.instance_variables.each do |v| # do something end 
 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" 

In Ruby 2.0 e, possibilmente in versioni precedenti, Object.const_get eseguirà in modo ricorsivo una ricerca su spazi dei nomi come Foo::Bar . L’esempio precedente è quando lo spazio dei nomi è noto in anticipo e sottolinea il fatto che const_get può essere richiamato direttamente sui moduli anziché esclusivamente su Object .