91 votes

Ruby Metaprogramming: noms de variables d'instance dynamiques

Disons que j'ai le hash suivant:

 { :foo => 'bar', :baz => 'qux' }
 

Comment pourrais-je définir de manière dynamique les clés et les valeurs pour qu'elles deviennent des variables d'instance dans un objet ...

 class Example
  def initialize( hash )
    ... magic happens here...
  end
end
 

... afin que je me retrouve avec ce qui suit à l'intérieur du modèle ...

 @foo = 'bar'
@baz = 'qux'
 

?

165voto

Chuck Points 138930

La méthode que vous recherchez est instance_variable_set . Alors:

 hash.each { |name, value| instance_variable_set(name, value) }
 

Ou, plus brièvement,

 hash.each &method(:instance_variable_set)
 

Si vos noms de variables d'instance ne comportent pas le "@" (comme ils le sont dans l'exemple du PO), vous devrez les ajouter afin que cela ressemble davantage à:

 hash.each { |name, value| instance_variable_set("@#{name}", value) }
 

12voto

DigitalRoss Points 80400
h = { :foo => 'bar', :baz => 'qux' }

o = Struct.new(*h.keys).new(*h.values)

o.baz
 => "qux" 
o.foo
 => "bar" 

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