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

2024-01-11

我对红宝石完全陌生。 我必须解析 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(使用前将#替换为@)

从 YAML 创建嵌套对象以通过 Ruby 中的方法调用访问属性 的相关文章

  • 通过推送通知唤醒

    Suppose 有一些对象 例如 一个数组a 和依赖于对象的条件 例如 a empty 当前线程以外的某些线程可以操作该对象 a 因此条件评估值的真实性会随着时间的推移而变化 如何让当前线程在代码中的某个时刻休眠 并在条件满足时通过推送通知
  • Watir 更改 Mozilla Firefox 首选项

    我正在使用 Watir 运行 Ruby 脚本来自动执行一些操作 我正在尝试自动将一些文件保存到某个目录 因此 在我的 Mozilla 设置中 我将默认下载目录设置为桌面并选择自动保存文件 然而 当我开始运行脚本时 这些更改并未反映出来 似乎
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • 如何在 Rails 4 中使用 params.require

    我有一个像这样的私有方法 用于有四个字段的注册表单 firstname email password and confirm password 我不知道如何检查password confirmation def user params pa
  • 无论如何要抓取重定向的链接吗?

    无论如何 我可以让 python 单击一个链接 例如 bit ly 链接 然后抓取生成的链接吗 当我抓取某个页面时 我唯一可以抓取的链接是重定向的链接 它重定向到的位置就是我需要的信息所在的位置 重定向有 3 种类型 HTTP 作为响应标头
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • ruby 中的 #encode 和 #force_encoding 有什么区别?

    我真的不明白之间的区别 encode and force encoding在 Ruby 中String班级 我明白那个 kam force encoding UTF 8 将迫使 kam 是UTF 8编码 但是怎么样 encode encod
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 我在 Rails 中使用了保留字吗?

    这是我的模型 class Record lt ActiveRecord Base belongs to user belongs to directory end class Directory lt ActiveRecord Base h
  • rvm gem 安装错误?

    我正在摆弄 ruby gems 和 rvm 它工作得很好 但现在当我尝试安装 gem 时出现错误 gem install Rails错误 同时 执行 gem Errno EACCES 权限被拒绝 Users da rvm gems ruby
  • 没有要加载的文件 - ffi_c (LoadError)

    这个问题困扰了我几天 每当我使用 bring to front 方法时 require rubygems require watir browser Watir Browser new browser bring to front 我收到此
  • Java 库有 parseInt、parseLong、parseDouble 等接受默认值并且不抛出异常吗?

    我喜欢中的建议java中的String到Int 可能是坏数据 需要避免异常 https stackoverflow com questions 174502 string to int in java likely bad data nee
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • SnakeYAML正在实例化ArrayList而不是HashMap

    我需要解析以下 YAML 文件 arguments Database Fold MetaFeature Algorithm Config processes id MetaFeatureCalculator command python m
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记
  • Watir Webdriver 加载 Chrome 扩展

    我正在尝试使用 Watir 加载 chrome 扩展 但遇到了问题 我发现这个相关问题 能够启动带有 watir webdriver 加载扩展的 chrome https stackoverflow com questions 125867
  • Ruby 中的 url_encode

    I read 的文档url encode http rdoc info stdlib erb 1 9 3 ERB Util 3Aurl encode 是否有一个表可以准确地告诉我哪个字符被编码为什么 使用url encode ERB s u

随机推荐