YAMLで気をつけないといけないこと

メモ。今日はRails3のI18Nと戦っていたのですが、そこではまったこと。

例えばこんな風なYAML(つきのRubyのコード)を書いたとします。

require 'yaml'

str = YAML.load <<EOB
foo:
  aaa:
    n1: "A"
  bbb:
    n2: "B"
  aaa:
    n3: "C"
EOB
p str

結果はどうなると思いますか? なんとなく、

{"foo"=>{"aaa"=>{"n1"=>"A", "n3"=>"C"}, "bbb"=>{"n2"=>"B"}}}

みたいなものを期待していたのですが、実は下記のようになります。

{"foo"=>{"aaa"=>{"n3"=>"C"}, "bbb"=>{"n2"=>"B"}}}

一つ目の「aaa」のところで書いたものは、二つ目の「aaa」が来たときに上書きされて消えてしまうわけですね。なんで「n1: "A"」が無視されるんだ! なんかバグってる?! とか思っていたのですが、勘違いでした。ああ。

YAMLを書くとき、特に後からどんどん書き足していくような場合には、前後も見て気をつけないといけないですね。