YAMLを使って設定値とかをハッシュで使えるようになった話

最近、何気に開いたパーフェクトRubyからYAMLの使い方を学び、その便利さに感動しました。

正直、YAMLを知ってる人にとっては、
CSVファイルを使ってデータをファイルにしました」ぐらい当たり前の話なんだろうと思いますが、
よく分かっていなかったことは事実なので、纏めていきたいと思います。

YAMLとは

Rubyist Magazine - プログラマーのための YAML 入門 (初級編)

YAML とは、構造化されたデータを表現するためのフォーマットです。 目的は XML と似ていますが、XML と比べて「読みやすい」「書きやすい」「わかりやすい」という利点があります。

何となく分かったような気になって次に進みます。

Rubyでの使い方

るりま library yaml

標準ライブラリでyamlがありますので、
require 'yaml'で使えるようになるみたいです。

使ってみました

  • sample.yml
  1 :server1:
  2   :id: test1
  3   :pw: pass1
  4  
  5 :server2:
  6   :id: test2
  7   :pw: pass2

ruby側でハッシュのキーがシンボルになるように:sever1:みたいな書き方にしています

  1 require 'yaml'
  2
  3 account = YAML.load_file('sample.yml')
  4
  5 # sever1の情報
  6 puts "sever1:"
  7 puts account[:server1][:id]
  8 puts account[:server1][:pw]
  9  
 10 # server2の情報
 11 puts "sever2:"
 12 puts account[:server2][:id]
 13 puts account[:server2][:pw]
  • 実行結果
sever1:
test1
pass1
sever2:
test2
pass2
  • (参考)yamlファイルをロードした結果の中身
[1] pry(main)> require 'yaml'
=> true
[2] pry(main)> YAML.load_file('sample.yml')
=> {:server1=>{:id=>"test1", :pw=>"pass1"},
 :server2=>{:id=>"test2", :pw=>"pass2"}}

ハッシュの値がハッシュという二次元のハッシュになっておりました。
意図通り、キーがシンボルになっております。

良いと思っているところ

恥ずかしながら、今まで接続先サーバのIPアドレスなど種々の設定値をどうやって書くか
全然見当が付いておりませんでした。ベタ書きは駄目だろうなぐらいで。。。

例えば、「サーバーにログインする」ということをやろうと思ったときに
「指定したURLのサーバーにログインするメソッド」(ここは概念的な話です)を作り login(config[:sever1])
login(config[:sever2])
みたいに書けて、URLとか色々情報の入ったハッシュを、まるっとメソッドに渡し、
メソッド側ではconfig[:url]みたいに、呼び出し元に関係なく、値がある前提でハッシュを使って粛々と話しを進められます。

あと、新しいサーバーが追加されても、YAMLファイルに書き足せば、基本動くわけですよね。
(上の例だとちょっとはrubyも書かなくてはいけないと思いますが・・・)
すごく便利に使えそうな予感がします!

最後に

Rubyってハッシュ(というかシンボル)がそこら中で使われてることを感じながらも、これまでその有用さをいまいち実感出来ずにいましたが、
YAMLからハッシュを使ってみたことで、おしゃれRubyistに一歩近づけた気持ちになりました。