这是我的 YAML 文件“test.yml”:
---
alpha: 100.0
beta: 200.0
gama: 300.0
--- 3
...
第一个文档是一个哈希。
第二个文档是一个整数。
我正在尝试将这些作为哈希和整数加载到 Ruby 程序中。
这是我目前的尝试:
require 'yaml'
variables = YAML.load_file('test.yml')
puts variables.inspect
要访问单个文件中的多个 YAML 文档,请使用该load_stream
方法(正如“matt”在对其他答案之一的评论中已经提到的):
YAML.load_stream(File.read('test.yml')) do |document|
puts document
end
铁皮人是正确的,OP 不应该针对他的具体问题使用多个文档;但是,实际中确实会出现 YAML 流中包含多个文档的情况,例如将多个 YAML 文档附加到单个文件时,因此值得了解如何处理它。
require 'yaml'
yaml = <<EOT
---
alpha: 100.0
beta: 200.0
gama: 300.0
---
int: 3
...
EOT
loop do
puts YAML.load(yaml)
break if !yaml.sub!(/(?<!#)(-{3}.+?(?=-{3})\n?){1}/m,'')
break if yaml.empty?
end
# >> {"alpha"=>100.0, "beta"=>200.0, "gama"=>300.0}
# >> {"int"=>3}
不要使用多个文档;它们不能替代定义数据中的单个元素:
require 'yaml'
yaml = <<EOT
---
hash:
alpha: 100.0
beta: 200.0
gama: 300.0
int: 3
EOT
YAML.load(yaml)
# => {"hash"=>{"alpha"=>100.0, "beta"=>200.0, "gama"=>300.0}, "int"=>3}
您可以通过分配YAML.load(yaml)
给变量来访问内容:
data = YAML.load(yaml)
data['hash'] # => {"alpha"=>100.0, "beta"=>200.0, "gama"=>300.0}
data['int'] # => 3
这样想,您在解析 YAML 文件后从 YAML 请求某种对象。您需要能够从中提取特定的值,因此您可以轻松自如地定义一个包含您想要的内容的数组或散列,以一种在 YAML 的限制和规范内以您的大脑方式工作的方式。
如果我要创建一个复杂的结构,我首先在 Ruby 中进行,然后让 YAML 为我转储格式:
require 'yaml'
data = {
"hash" => {
"alpha" => 100.0,
"beta" => 200.0,
"gama" => 300.0
},
"int" => 3
}
puts data.to_yaml
# >> ---
# >> hash:
# >> alpha: 100.0
# >> beta: 200.0
# >> gama: 300.0
# >> int: 3
我可以将 Ruby 代码放入脚本并运行它,将其重定向到 YAML 文件:
ruby test.rb > test.yaml
然后我可以扩展结构:
require 'yaml'
data = {
"hash" => {
"alpha" => 100.0,
"beta" => 200.0,
"gama" => 300.0
},
"int" => 3,
"array" => %w[a b c]
}
puts data.to_yaml
# >> ---
# >> hash:
# >> alpha: 100.0
# >> beta: 200.0
# >> gama: 300.0
# >> int: 3
# >> array:
# >> - a
# >> - b
# >> - c
来回测试它:
require 'yaml'
yaml = <<EOT
---
hash:
alpha: 100.0
beta: 200.0
gama: 300.0
int: 3
array:
- a
- b
- c
EOT
YAML.load(yaml)
# => {"hash"=>{"alpha"=>100.0, "beta"=>200.0, "gama"=>300.0}, "int"=>3, "array"=>["a", "b", "c"]}
反复执行此操作,直到您对 YAML 语法感到满意,然后您可以手动构建/调整您的 YAML 文件。
现在,这就是它的聪明之处。&
YAML 规范支持别名,它让我们定义一个变量,然后分别使用和多次重用它*
。当您的文档变大时,手动创建它们会很痛苦,但是 YAML 驱动程序很聪明,会为您输出它们:
require 'yaml'
FOO = ['foo']
BAR = ['bar']
foobar = [FOO, BAR]
data = {
"foo" => FOO,
'bar' => BAR,
'foobar' => foobar,
}
puts data.to_yaml
# >> ---
# >> foo: &1
# >> - foo
# >> bar: &2
# >> - bar
# >> foobar:
# >> - *1
# >> - *2
foo: &1
定义["foo"]
, 并在底部被重用为*1
.
“ YamlForRuby 站点上的 Yaml Cookbook ”是使用 YAML 的一个很好的参考。