はじめに
「そういえば、yamlって良く使うくせにちゃんと調べたことがないな」
と思い、特徴的な書き方をする機能3つに絞ってまとめました。
Ruby on Railsで良く使う、database.yaml
を例に説明します。
環境
OS: macOS Catalina 10.15.1
Ruby: 2.6.5
Rails: 6.0.2.1
そもそもyaml
って何?
YAML is a human friendly data serialization
standard for all programming languages.
公式より抜粋しました。
「YAMLは全てのプログラミング言語で使える、人間に優しいデータの書き方だよ!」ということですね。
要するに、複雑なデータ構造をシンプルに表現するファイル形式です。
ここからRuby on Railsのapp/config/database.yml
を例に、他ではあまり見ない記法について説明していきます。
例:database.yml
コメントでどこで何を使っているのか書いています。
それぞれの説明は後述します。
default: &default #アンカー
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
development:
<<: *default #エイリアス・ハッシュのマージ
database: app_name_development
test:
<<: *default #エイリアス・ハッシュのマージ
database: app_name_test
production:
<<: *default #エイリアス・ハッシュのマージ
database: app_name_production
username: app_name
password: <%= ENV['APP_NAME_DATABASE_PASSWORD'] %>
アンカー: 名前をつける機能
&default
これをアンカーと呼びます。
該当部に名前をつける機能です。
実例
default:
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
上記ハッシュ(連想配列)のことをdefault
と呼ぶよという宣言をするなら
↓
アンカーを追記する。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
アンカーを書いておくことにより、次のエイリアスが使えるようになります。
エイリアス: 名前をつけたものを呼び出す
*default
アンカーを付けたものを呼び出すときに使います。
これがどう使われているのかは以下ハッシュのマージを絡めて後述します。
ハッシュのマージ: 一つにまとめる
※2020/01/17追記 YAMLでの正式名称はハッシュではなくマッピングです。
ここではRuby on Railsを例にしているため、わかりやすくするためハッシュと表現しています。
(scivolaさんアドバイスありがとうございます)
参考:プログラマーのための YAML 入門 (初級編)
<<: *default
<<:
の右側にあるものを、該当部にまとめるという意味になります。
以下例をご覧ください。
実例
ここまで出てきた
- アンカー
- エイリアス
- ハッシュのマージ
の知識を使うと、以下のdevelopment
で何を意味しているのかが説明できます。
default: &default #ここで共通部分にアンカーで名前をつけておくと
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
development:
<<: *default #ここでdefaultとして呼び出し、スッキリ書ける
database: app_name_development
↓
つまり、developmentに以下が書かれているのと同じ意味になります。
#...略
development:
#ここからdefault
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
#ここまでdefault
database: app_name_development
以上です!
おわりに
最後まで読んで頂きありがとうございました
どなたかの参考になれば幸いです