ruby YAML解析器在别名数组时产生无关的`<<`

时间:2018-01-12 06:37:54

标签: ruby parsing yaml

我想解析YAML

foo: &foo
  - a: 1
bar: 
  <<: *foo

当我尝试使用ruby的YAML时,我得到一个奇怪的结果:

YAML.load("
foo: &foo
  - a: 1
bar: 
  <<: *foo
")

=> {"foo"=>[{"a"=>1}], "bar"=>{"<<"=>[{"a"=>1}]}}

注意奇数<<的外观。我原以为

   {"foo"=>[{"a"=>1}], "bar"=>[{"a"=>1}]} 

我是否误解了如何使用YAML语法?

如果相关:

ENV['RBENV_VERSION']
=> "2.4"
YAML.libyaml_version
=> [0, 1, 4]

我对我的语法也有点怀疑,因为当我将其插入online yaml parser时,我会得到不同的输出,但也与我的期望不同:

{
  "foo": [{"a": 1}],
  "bar": {"a": 1}
}

(对不起,那个json - 但重点是bar值没有像我期望的那样包在数组括号中。

2 个答案:

答案 0 :(得分:1)

合并时似乎无法使用数组作为顶级键。 如果你创建一个新的rails应用程序,你可以在 config/database.yml (这里是一个代码片段)

中看到使用此模式的rails
# config/database.yml

default: &default
  adapter: postgresql

development:
  <<: *default

在上面的示例中,它工作正常,但看到 default 键下方没有数组。

为了使代码工作正常,您应该将数组包装在另一个键中,如下所示:

# example.yml
foo: &foo
  list:
    - a: 1
bar:
  <<: *foo

然后你会得到:

YAML.load_file('example.yml')
#=> {"foo"=>{"list"=>[{"a"=>1}]}, "bar"=>{"list"=>[{"a"=>1}]}}

正如您所看到的,主要问题是使用数组而不将它们包装到父键中。

答案 1 :(得分:0)

好的,我想我在这个问题中找到了答案:https://stackoverflow.com/a/4949139/239712。即,

  

...它没有定义合并的功能。根据{{​​3}},合并键可以具有值:

     
      
  • 映射,在这种情况下,它会合并到父映射中。
  •   
  • 映射序列,在这种情况下,每个映射都会逐个合并到父映射中。
  •   
     

没有办法合并序列。