# Rubyのdo endと{ }は違うらしいよ。
_published: 2008/11/14_ 
メソッドにブロックを渡す時には、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としている書籍もあったと思います。