RubyのHash式の { } は省略もできるけど完全に同一ではない

まぁ当たり前の話なんですけど。

Ruby の Hash は

{
  key1 => val1,
  key2 => val2,
  ...
}

と書くのだけれど、メソッドの最後の引数にする場合にはこの { } を省略することができる。つまり

method( { key1 => val1, key2 => val2 } )

これを

method( key1 => val1, key2 => val2 )

のように書けるということ。実際には ( ) も省略できるので

method key1 => val1, key2 => val2

こうでもよい。これがよく Rails で使われている記法で、メソッド呼び出しのように見えず、何かの宣言を書いているように見える。これだけでも今までのプログラムの書き方と違う感じがする1

しかしこの { } の省略をすると末尾の , を余計に付けることができない。当たり前といえば当たり前なんだけど、

method key1 => val1,
       key2 => val2,

と書いてしまうと val2 で値が終わったことが分からずに syntax error になってしまう。

{ } をちゃんと書いているときについ末尾の , を残す書き方をしているとハマる。Hash定義が何行にも渡るものを書いていて、かつまだ変更の可能性があるときに , を付けて書くクセがあったのでハマってしまった。

  1. 個人的にはあまりこの書き方ばかり押すのは好きじゃないんだけど 

More