青山です。

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

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


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>