我对红宝石完全陌生。
我必须解析 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
但是,我想通过方法调用访问属性
For e.g.
puts object.projects.first.developers.last.certifications.first.name
# should print ABC
有没有办法构造这样一个对象,其属性可以通过上面提到的(点)方式访问?
我读过关于开放结构 https://stackoverflow.com/questions/16990834/how-can-i-convert-nested-yaml-to-nested-arrays-and-openstructs-in-ruby and hashugar https://github.com/jsuchal/hashugar。
我还想避免使用第三方宝石
Xavier 的回答很好,但它可以更短,只需要 yaml、json 和 ostruct 并解析你的 YAML,将其转换为 JSON,在 Openstruct 中解析它(也可以是 Struct),如下所示
object = JSON.parse(YAML.load(yaml).to_json, object_class: OpenStruct)
要从文件加载 YAML,它是
object = JSON.parse(YAML::load_file("./test.yaml").to_json, object_class: OpenStruct)
这给出了
object
=>#<OpenStruct projects=[#<OpenStruct name="Project1", developers=[#<OpenStruct name="Dev1", certifications=[#<OpenStruct name="cert1">]>, #<OpenStruct name="Dev2", certifications=[#<OpenStruct name="cert2">]>]>, #<OpenStruct name="Project2", developers=[#<OpenStruct name="Dev1", certifications=[#<OpenStruct name="cert3">]>, #<OpenStruct name="Dev2", certifications=[#<OpenStruct name="cert4">]>]>]>
object.projects.first.developers.last.certifications.first.name
=>cert2
我使用它从文件加载配置,Yaml 很容易维护,并且在代码中它比 Hash 中的配置更容易使用。
不要为重复性任务执行此操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)