do .. end と{}の違い
Rubyを使っていて、メソッドにブロックを渡す方法にタイトルのような2種類ある理由がいまいちわからなかった。そして私はそれを放置し、今まで好みだけで使い分けてきましたが、人に聞かれてわからなかったので調べてみました。
・http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/18592
do .. end, { .. } の違いは本当にやっかいでしたよね。バイブルには間に合わなかったようですが、現在の Ruby では do .. end でも戻り値の代入ができるようになりましたので、両者の違いは簡単になっています。 foo a, b do ... end # foo にブロックが引き渡されます。 foo a, b { ... } # b にブロックが引き渡されます。 さらには、この違いを覚えるのも結構面倒なので、メソッド名の後には () を付けるというようにすると、両者の違いを覚える必要さえなくなります。 foo(a, b) do ... end # foo にブロックが引き渡されます。 foo(a, b) { ... } # foo にブロックが引き渡されます。 foo a, b() do ... end # b にブロックが引き渡されます。 foo a, b() { ... } # b にブロックが引き渡されます。 という事で、迷った時にはメソッド名の後に () を付けるというように覚えるのが簡単でしょう。
今まで大体ブロック前のメソッドには()をつけてたので実害がなかったのでしょう。
お勉強になりました。