Comment créer une instance de classe à partir d’un nom de chaîne dans Ruby?

J’ai le nom d’une classe et je veux créer une instance de cette classe pour que je puisse parcourir chaque atsortingbut de rail présent dans le schéma de cette classe.

Comment pourrais-je faire ça?

  1. J’ai le nom comme chaîne de la classe que je veux vérifier
  2. Je suppose que je dois instancier une instance de classe pour que je puisse
  3. Parcourez ses atsortingbuts et imprimez-les.

Dans les rails, vous pouvez simplement faire:

 clazz = 'ExampleClass'.constantize 

En rbuy pur:

 clazz = Object.const_get('ExampleClass') 

avec des modules:

 module Foo class Bar end end 

vous utiliseriez

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

Très simple dans Rails: utilisez Ssortingng#constantize

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

Essaye ça:

 Kernel.const_get("MyClass").new 

Ensuite, pour parcourir les variables d’instance d’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" 

Dans ruby ​​2.0 et, éventuellement, dans les versions précédentes, Object.const_get effectuera une recherche récursive sur des espaces de noms tels que Foo::Bar . L’exemple ci-dessus const_get que l’espace de noms est connu à l’avance et met en évidence le fait que const_get peut être appelé directement sur des modules, et non exclusivement sur des Object .