web-dev-qa-db-fra.com

Comment créer une instance de classe à partir d'un nom de chaîne en ruby?

J'ai le nom d'une classe et je veux créer une instance de cette classe afin de pouvoir parcourir chaque attribut Rails présent dans le schéma de cette classe.

Comment pourrais-je m'y prendre?

  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 pouvoir
  3. Parcourez ses attributs et imprimez-les.
108
mhenrixon

Dans Rails vous pouvez simplement faire:

clazz = 'ExampleClass'.constantize

En rubis 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
  => #<Foo::Bar:0x0000010110a4f8> 
198
Wes

Très simple dans Rails: utilisez String#constantize

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

Essaye ça:

Kernel.const_get("MyClass").new

Ensuite, pour parcourir les variables d'instance d'un objet:

obj.instance_variables.each do |v|
  # do something
end
5
mbreining
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, des versions antérieures, Object.const_get va effectuer récursivement une recherche sur un espace de noms tel que Foo::Bar. L'exemple ci-dessus est celui où l'espace de noms est connu à l'avance et met en évidence le fait que const_get peut être appelé directement sur les modules, par opposition à exclusivement sur Object.

4
A-Dubb