有没有办法通过哈希来初始化一个对象?

如果我有这个class级:

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

和这个代码:

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

是否有可能直接从哈希值初始化对象,而不需要通过每对来调用instance_variable_set ? 就像是:

 a = A.new(h) 

这应该导致每个实例variables被初始化为散列中具有相同名称的variables。

你可以在你的类上定义一个初始化函数:

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

或者你可以创build一个模块,然后“混合”

 module HashConstructed def initialize(h) h.each {|k,v| public_send("#{k}=",v)} end end class Foo include HashConstructed attr_accessor :foo, :bar end 

或者,你可以尝试一些像构造函数

OpenStruct值得考虑:

 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 

instance_variable_set用于这种用例:

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

这是一个公共的方法,所以你也可以在施工之后调用它:

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

但请注意文档中的隐含警告:

将实例variables名称按符号设置为对象,从而使得类的作者尝试提供适当的封装的努力受挫。 这个调用之前,variables不一定存在。