yaml

いわゆる、書き方が知りたい人はRubyistMagazine

複数行にわたるyamlの書き方

要するに改行を使いたい時。
少しはまったので。メモ。

hoge:
 - |- Proc.new {|params|
   puts params
   }
 - "Proc.new {|params| puts params}"

↑はOKな例。僕は↓を書いてハマった。

hoge:
 - |- "Proc.new {|params|
   puts params
   } "
 - "Proc.new{|params| puts params}"

何がダメかというと、文字列の扱いに気づいてない僕が問題w
これを文字列としてしか使わない場合は大体OKだろうけど、evalとかに使いたい場面で困る。
実際にダメな方でやってみる。

irb(main):026:0>a = YAML::load_file('test.yml') #上記ダメな方のyaml
=> {"hoge"=>["\"Proc.new {|params|puts params\n  } \"", "Proc.new{|params| puts
params}"]}
irb(main):027:0> (eval a['hoge'][0]).call("test")
NoMethodError: undefined method `call' for "Proc.new {|params|puts params\n  } "
:String
        from (irb):27
irb(main):028:0> (eval a['hoge'][1]).call("test")
test
=> nil
irb(main):029:0> exit

yamlではどうやら、どれにも確定しなかった場合に文字列として扱うらしい。

hoge:       #キー
 - hoge     #配列の要素文字列
 - "hoge"   #配列の要素文字列
 - 'hoge'   #配列の要素文字列
 - | "hoge" #バーチカルバーがあると、それは複数行にまたがる文字列である
            #事が確定するので、ダブルクォート込みで文字列になる
            #つまり読み込むと"\"hoge\""となる。
 - 1        #数値

他の複数行にまたがる表現の時も同じ。

言われてみれば納得だけど、気づかんよ。要らんとこでハマッぜ。。。

次回もyamlがらみでハマった話を書いてみます。おやすみなさい。