15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

YAML でマッピングのマージ

Last updated at Posted at 2014-11-22

PHP の Symfony Yaml 2.5.7 と、Ruby 2.1.5 の yaml で確認しています。

Ruby の yaml は Psych という libyaml のラッパーらしいので、libyaml が使われている場合は概ね同じなのではないでしょうか。

一方 PHP の Symfony Yaml はパーサが独自に実装されています。


次のようにマッピング(連想配列)のキー部分に << を記述し、要素をマッピングのシーケンス(配列)にすると・・・

input.yaml
<<:
  - a: 1
    b: 2
  - c: 3
    d: 4
e: 5

次のようにマッピングがマージされます。

outout.yaml
a: 1
b: 2
c: 3
d: 4
e: 5

Ruby の yaml だとフロースタイルで次のようにも記述できました。

input.yaml
{ <<: [ {a: 1, b: 2}, {c: 3, d: 4} ], e: 5 }

が、PHP の Symfony Yaml だとこの形式は "<<" というキーを持つ連想配列になってしまいました。


アンカーとエイリアスを組み合わせて、次のように使うと便利です。

base: &base
  a: 1
  b: 2
  c: 3

ore:
  <<: [*base]
  a: 0

are:
  <<: [*base]
  x: 9

と、思ったら、次のようにも書けました。

base: &base
  a: 1
  b: 2
  c: 3

ore:
  <<: *base
  a: 0

are:
  <<: *base
  x: 9

んん?


次の形式は PHP の Symfony Yaml だとマージされましたが、Ruby の yaml だとマージされませんでした。

<<:
  a: 1
  b: 2
  c: 3
  d: 4
e: 5

次の形式は PHP も Ruby もマージされませんでした。

{ <<: { a: 1, b: 2, c: 3, d: 4 }, e: 5 }

次の形式のようにエイリアスだと PHP でも Ruby でもマージされました。

- base: &base
    a: 1
    b: 2
    c: 3
    d: 4

- <<: *base
  e: 5

フロースタイルだと Ruby ならマージされますが、PHP だとやっぱりマージされませんでした。

- base: &base { a: 1, b: 2, c: 3, d: 4 }
- { <<: *base, e: 5 }

うーん?


よくわからないので YAML の仕様を確認しようとしたのですが、記述が見つかりませんでした。

下記の記事によると・・・

下記にちらっとだけ書かれていました。

るびまにも書かれていたようですが NoMethodError とかなっていて表示されていません。

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?