我想将包含嵌套哈希的哈希转换为对象,以便可以使用点语法访问属性(包括嵌套属性)。
到目前为止,此代码成功地将第一个哈希对象转换:
class Hashit
def initialize(hash)
hash.each do |k,v|
self.instance_variable_set("@#{k}", v)
self.class.send(:define_method, k, proc{self.instance_variable_get("@#{k}")})
self.class.send(:define_method, "#{k}=", proc{|v| self.instance_variable_set("@#{k}", v)})
end
end
end
问题在于,这种方法无法处理嵌套的哈希表:
h = Hashit.new({a: '123r', b: {c: 'sdvs'}})
=> #<Hashit:0x00000006516c78 @a="123r", @b={:c=>"sdvs"}>
请注意,输出结果中@b={:c=>"sdvs"}
没有被转换,它仍然是一个哈希表。
如何将嵌套的哈希表转换为对象?
h
具有实例变量[:@a, :@b, :@c]
,正如@Ben和我所假设的那样,您选择的答案是不正确的。 - Cary Swoveland