gpt4 book ai didi

parsing - 从 YAML 创建嵌套对象以通过 Ruby 中的方法调用访问属性

转载 作者:行者123 更新时间:2023-12-04 13:49:31 24 4
gpt4 key购买 nike

我对 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

有什么方法可以构造这样一个对象,其属性可以通过上面提到的(点)方式访问?
我读过 OpenStructhashugar .
我也想避免使用第三方 gem

最佳答案

如果您只是在试验,有一种快速而肮脏的方法可以做到这一点:

class Hash
def method_missing(name, *args)
send(:[], name.to_s, *args)
end
end

不过我不会在生产代码中使用它,因为 method_missing和猴子修补通常是在路上遇到麻烦的秘诀。

更好的解决方案是递归遍历数据结构并用 openstructs 替换散列。
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

请注意,如果您经常使用这两种方法,则这两种方法都存在潜在的性能问题 - 如果您的应用程序对时间敏感,请确保对它们进行基准测试!不过,这可能与您无关。

关于parsing - 从 YAML 创建嵌套对象以通过 Ruby 中的方法调用访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com