首先,我仍然是Ruby新手,所以这可能是一个琐碎的问题,但是无论如何,我仍在努力。 因此,我设置了一个YAML文件,如下所示:
Base
假设YAML文件已加载到Ruby中,我将如何检索该文件的特定部分,例如检索userA的水果或userB的canDance?预先感谢。
答案 0 :(得分:3)
您可以像这样从YAML中读取所需的信息:
require 'yaml'
people = YAML.load_file('the_filename.yaml')
puts people['userA']['fruit'] #=> 'apple'
puts people['userB']['canDance'] #=> true
注意:您的YAML文件似乎有效,并且可以由默认的Ruby YAML解析器读取。但是它使用了非常特殊且不常见的语法。我建议这样写您的YAML:
userA:
nick: cat
fruit: apple
canDance: true
age: 20
userB:
nick: dog
fruit: orange
canDance: false
age: 23
答案 1 :(得分:0)
已更新:您的示例数据可以通过Ruby的标准lib YAML进行解析,但是不需要花括号和逗号。
以下是为hobbies
添加了一些混合类型的示例
---
userA:
nick: cat
fruit: apple
canDance: true
age: 20
hobbies:
- coding
- tennis
music:
production: true
djing: true
guitar: true
userB:
nick: dog
fruit: orange
canDance: false
age: 23
hobbies:
- coding
- ruby
sports:
tennis: always
soccer: sometimes
running: rarely
使用您只需要求的Ruby Yaml core lib。
require 'yaml'
people = File.load_file 'test.yml'
people
现在是Hash class的实例,它使您可以通过在方括号内调用键来获取键的值,如下所示:
people['userA']
现在,您可以通过链接如下键来浏览对象:
people['userA']['hobbies']
但是请注意,如果链条“断裂”,您将得到一个错误消息
people['userB']['sports']['tennis'] # this works
=>"always"
people['userA']['sports']['tennis'] # this will raise
=>NoMethodError: undefined method `[]' for nil:NilClass
引发异常是因为people['userA']['sports']
返回nil,因此尝试链接['tennis']
会引发错误。挖掘深度嵌套的哈希时,避免这种情况的一种有用方法是使用.dig
people.dig('userB','sports','tennis')
=>"always"
people.dig('userA','sports','tennis')
=>nil #
people.dig('userA','music','djing')
=>true
people.dig('userB','music','djing')
=>nil
使用散列符谁是字符串,您还可以对字符串进行插值。假设我们要随机选择一个用户并进行挖掘,我们可能会做类似的事情:
people.dig("user#{ ['A','B'].sample }",'music','djing')