ruby - 递归地将 Hash 转换为 OpenStruct

标签 ruby

鉴于我有这个散列:

 h = { a: 'a', b: 'b', c: { d: 'd', e: 'e'} }

然后我转换为 OpenStruct:

o = OpenStruct.new(h)
 => #<OpenStruct a="a", b="b", c={:d=>"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"

我怎样才能做到这一点?

最佳答案

你可以猴子修补 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'

参见 Convert a complex nested hash to an object .

关于ruby - 递归地将 Hash 转换为 OpenStruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519557/

相关文章:

ruby-on-rails - 如何在 procfile 和 foreman 中使用 Rails 服务器和机器人?

ruby - 从包含的文件中,如何获取执行包含的文件的文件名?

ruby - 如何在不删除对外部 API 的访问的情况下为 ruby​​ 设置虚拟环境或沙箱?

ruby - 在 ruby​​ 中将子类方法作为函数参数传递

ruby-on-rails - rails : correct way of turning activerecord relation to array?

ruby-on-rails - 如何在 OpenURI (Ruby) 中发送自定义 header 并检查它们

ruby - 使用 initialize 定义带参数的类方法

ruby-on-rails - Rails应用程序流程图生成?

arrays - 为什么这些函数之一改变原始数组而不是另一个?

ruby - Rails 虚拟对象添加到 Active Record 数组