Rubyでyamlファイルを書く必要があって、ちょっと書いてみたらシンボルを使うのにすごく変な書き方をしないといけない事を知った。

普通にこんな感じでyamlファイルを書くと、Rubyで呼び出す時に一見シンボルで呼び出せそうだが、文字列で呼び出さなくてはいけない。

# config.yml
foo:
  aaa: foo
  bbb: bar
config = YAML.load_file("config.yml")
p config["foo"]        #=> {"aaa"=>"foo", "bbb"=>"bar"}
p config["foo"]["aaa"] #=> "foo"
p config["foo"][:bbb]  #=> nil

うーん。なんか文字列って違和感がある。シンボルで書けたら綺麗なのに。

で、単純にシンボルで呼び出せるようにするにはyaml側の書き方を変える必要があるみたい。

# config.yml
:foo:
  :aaa: foo
  :bbb: bar
config = YAML.load_file("config.yml")
p config[:foo]        #=> {:aaa=>"foo", :bbb=>"bar"}
p config[:foo]["aaa"] #=> nil
p config[:foo][:bbb]  #=> "bar"

……なんかこのyamlファイルはイヤだ。

で、調べてみるとhashieというgemを使うと、yaml側は普通の書き方で呼び出しはシンボルみたいな事ができるみたい。gem i hashieしてさっそくテストしてみる。

# config.yml
foo:
  aaa: foo
  bbb: bar
require "hashie"
config = Hashie::Mash.new(YAML.load_file("./config.yml"))
p config[:foo]        #=> #<Hashie::Mash aaa="foo" bbb="bar">
p config[:foo]["aaa"] #=> "foo"
p config[:foo][:bbb]  #=> "bar"

ふむ。これは便利だ。次にyamlを使う時に覚えておこう。