116 votes

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

J'ai le nom d'une classe et que je veux créer une instance de cette classe pour que je puisse en boucle sur chaque rails attribut qui est présent dans le schéma de la classe.

Comment pourrais-je aller sur le faire?

  1. J'ai le nom d'une chaîne de la classe je veux vérifier
  2. Je suppose que j'ai besoin d'instancier une classe, de sorte que je peux
  3. Boucle par le biais d'attributs et de les imprimer.

211voto

Wes Points 3337

Dans les rails, tu peux faire:

clazz = 'ExampleClass'.constantize

Dans le plus pur ruby:

clazz = Object.const_get('ExampleClass')

avec des modules:

module Foo
  class Bar
  end
end

vous utilisez

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

15voto

edgerunner Points 9581

Très simple: utiliser String#constantize

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

5voto

mbreining Points 3981

Essayez ceci:

Kernel.const_get("MyClass").new

Alors pour faire une boucle dans une instance de l'objet de variables:

obj.instance_variables.each do |v|
  # do something
end

4voto

A-Dubb Points 953
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"

En ruby 2.0 et, éventuellement, les versions antérieures, Object.const_get sera récursivement effectuer une recherche sur un des espaces de noms comme Foo::Bar. L'exemple ci-dessus, c'est quand l'espace de noms est connu à l'avance et souligne le fait qu' const_get peut être appelée sur les modules directement plutôt exclusivement sur Object.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X