假设我有这个散列:
h = { a: 'a', b: 'b', c: { d: 'd', e: 'e'} }然后我将其转换为OpenStruct:
o = OpenStruct.new(h)
=> #"d", :e=>"e"}>
o.a
=> "a"
o.b
=> "b"
o.c
=> {:d=>"d", :e=>"e"}
2.1.2 :006 > o.c.d
NoMethodError: undefined method `d' for {:d=>"d", :e=>"e"}:Hash我希望所有嵌套的键也都是方法。这样我就可以访问d因此:
o.c.d
=> "d"我怎样才能做到这一点呢?
发布于 2017-08-24 10:23:33
你可以用猴子补丁Hash类
class Hash
def to_o
JSON.parse to_json, object_class: OpenStruct
end
end然后你可以说
h = { a: 'a', b: 'b', c: { d: 'd', e: 'e'} }
o = h.to_o
o.c.d # => 'd'发布于 2017-03-01 06:11:54
我想出了这个解决方案:
h = { a: 'a', b: 'b', c: { d: 'd', e: 'e'} }
json = h.to_json
=> "{\"a\":\"a\",\"b\":\"b\",\"c\":{\"d\":\"d\",\"e\":\"e\"}}"
object = JSON.parse(json, object_class:OpenStruct)
object.c.d
=> "d"因此,为了让它正常工作,我必须执行一个额外的步骤:将其转换为json。
发布于 2019-07-30 06:29:54
下面是一个递归解决方案,可以避免将散列转换为json:
def to_o(obj)
if obj.is_a?(Hash)
return OpenStruct.new(obj.map{ |key, val| [ key, to_o(val) ] }.to_h)
elsif obj.is_a?(Array)
return obj.map{ |o| to_o(o) }
else # Assumed to be a primitive value
return obj
end
endhttps://stackoverflow.com/questions/42519557
复制相似问题