解析 – 从YAML创建嵌套对象,通过Ruby中的方法调用访问属性
发布时间:2020-12-17 02:48:04 所属栏目:百科 来源:网络整理
导读:我对ruby完全不熟悉. 我必须解析一个YAML文件来构造一个对象 YAML文件 projects: - name: Project1 developers: - name: Dev1 certifications: - name: cert1 - name: Dev2 certifications: - name: cert2 - name: Project2 developers: - name: Dev1 certif
我对ruby完全不熟悉.
我必须解析一个YAML文件来构造一个对象 YAML文件 projects: - name: Project1 developers: - name: Dev1 certifications: - name: cert1 - name: Dev2 certifications: - name: cert2 - name: Project2 developers: - name: Dev1 certifications: - name: cert3 - name: Dev2 certifications: - name: cert4 我想从这个YAML创建一个对象,我在Ruby中编写了以下代码 require 'yaml' object = YAML.load(File.read('./file.yaml')) 我可以使用[]成功访问此对象的属性 puts object[projects].first[developers].last[certifications].first[name] # prints ABC 但是,我想通过方法调用访问属性 对于例如 puts object.projects.first.developers.last.certifications.first.name # should print ABC 有没有办法构建这样一个对象,其属性可以用上面提到的(点)方式访问? 解决方法
如果你只是在试验,有一种快速而肮脏的方法来做到这一点:
class Hash def method_missing(name,*args) send(:[],name.to_s,*args) end end 我不会在生产代码中使用它,因为method_missing和monkey-patching通常都是为了解决问题的方法. 更好的解决方案是递归遍历数据结构并用opentructs替换哈希. require 'ostruct' def to_ostruct(object) case object when Hash OpenStruct.new(Hash[object.map {|k,v| [k,to_ostruct(v)] }]) when Array object.map {|x| to_ostruct(x) } else object end end puts to_ostruct(object).projects.first.developers.last.certifications.first.name 请注意,如果您正在进行大量操作,那么这两种方法都存在潜在的性能问题 – 如果您的应用程序是时间敏感的,请确保对它们进行基准测试!这可能与你无关. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |