加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

解析 – 从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

有没有办法构建这样一个对象,其属性可以用上面提到的(点)方式访问?
我读过关于OpenStruct和hashugar的内容.
我也想避免使用第三方宝石

解决方法

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

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

请注意,如果您正在进行大量操作,那么这两种方法都存在潜在的性能问题 – 如果您的应用程序是时间敏感的,请确保对它们进行基准测试!这可能与你无关.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读