にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

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 にブロックが引き渡されます。

という事で、迷った時にはメソッド名の後に () を付けるというように覚えるのが簡単でしょう。

今まで大体ブロック前のメソッドには()をつけてたので実害がなかったのでしょう。
お勉強になりました。