# Rubyのdo endと{ }は違うらしいよ。 _published: 2008/11/14_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20081114/1226661036) メソッドにブロックを渡す時には、2通りの書き方があります。 ```ruby [1, 2, 3].each do |i| puts i end [1, 2, 3].each { |i| puts i } ``` この違いを意識することはあまりないのですが。。 マニュアルを見ると。 > ただし、do...endと {...}で動作が異なる場合があります。 > > foobar a, b do .. end # foobar がブロック付きメソッドとして呼び出されます > foobar a, b { .. } # b がブロック付きメソッドとして呼び出されます > > これは{ }の方がdoブロックよりも結合強度が強いためです。 > > [Ruby Reference Manual - るりま](http://www.ruby-lang.org/ja/man/html/FAQ_A5D6A5EDA5C3A5AFC9D5A4ADA5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html) となっています。 さっそく、実験。 ```ruby def foobar a, b if block_given? yield a, b else puts a * b end end ``` do end ```ruby foobar 2, 3 do |a, b| puts a + b #=> 5 end ``` { } ```ruby def b yield end foobar 2, b { 3 } #=> 6 ``` まあ、このようなシチュエーションがどれくらいあるか?ですね。ちなみに、「初めてのRuby」で著者は、イテレータにはdo endを、ブロックによるリソース管理を行う場合は波括弧を利用するとしていますね。あと、いくつかの有力なコーディング規約では。 - 基本的にdo endを利用する - メソッドの戻り値を利用する場合のみ波括弧を使用する - あるいは、a.hoge{ }.huga{ }のようにメソッドチェーンをする場合のみ波括弧を使う たしか、1行の場合は波括弧、複数行の場合はdo endとしている書籍もあったと思います。