Geo Geo - 1 year ago 37
Ruby Question

Is there a way to initialize an object through a hash?

If I have this class:

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


and this code:

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


is it possible to initialize the object directly from the hash, without me needing to go over each pair and call
instance_variable_set
? Something like:

a = A.new(h)


which should cause each instance variable to be initialized to the one that has the same name in the hash.

Answer Source

You can define an initialize function on your class:

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

Or you can create a module and then "mix it in"

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

class Foo
 include HashConstructed
 attr_accessor :foo, :bar
end

Alternatively you can try something like constructor