37 votes

Existe-t-il un moyen d'initialiser un objet via un hachage?

Si j'ai cette classe:

 class A
  attr_accessor :b,:c,:d
end
 

et ce code:

 a = A.new
h = {"b"=>10,"c"=>20,"d"=>30}
 

est-il possible d'initialiser l'objet directement à partir du hachage, sans que j'aie besoin de parcourir chaque paire et d'appeler instance_variable_set ? Quelque chose comme:

 a = A.new(h)
 

ce qui devrait provoquer l'initialisation de chaque variable d'instance à celle qui a le même nom dans le hachage.

51voto

jrhicks Points 5369

Vous pouvez définir une fonction d'initialisation sur votre classe:

 class A
  attr_accessor :b,:c,:d
  def initialize(h)
    h.each {|k,v| send("#{k}=",v)}
  end
end
 

Ou vous pouvez créer un module puis "le mélanger"

 module HashConstructed
 def initialize(h)
  h.each {|k,v| send("#{k}=",v)}
 end
end

class Foo
 include HashConstructed
 attr_accessor :foo, :bar
end
 

Alternativement, vous pouvez essayer quelque chose comme constructeur

15voto

steenslag Points 29662

OpenStruct mérite d'être considéré:

 require 'ostruct' # stdlib, no download
the_hash = {"b"=>10, "c"=>20, "d"=>30}
there_you_go = OpenStruct.new(the_hash)
p there_you_go.c #=> 20
 

10voto

klochner Points 5595

instance_variable_set est prévu pour ce genre de cas d'utilisation:

class A
  def initialize(h)
    h.each {|k,v| instance_variable_set("@#{k}",v)}
  end
end

C'est une méthode publique, de sorte que vous pourrait aussi l'appeler après la construction:

a = A.new({})
a.instance_variable_set(:@foo,1)

Mais notez l'avertissement implicite dans la documentation:

Définit la variable d'instance de noms de symbole pour objet, trompant ainsi les efforts de la classe de l'auteur pour tenter d'assurer une bonne encapsulation. La variable n'existe pas avant cet appel.

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