do...end と {} の違い

do...end と {} の違い

基本的にはどっちを使っても結果は同じ。

違いは、 do...end よりも {} のほうが

結合度が強い

どういうことか?

配列のdeleteメソッドの例

a = [1, 2, 3]

a.delete(100)
=> 0

a.delete(100) do
  'できない'
end
=> "できない"

ブロックを渡さない時は指定した値が見つからないとnilが返る

ブロックを渡すと指定した値が見つからない時はブロックの戻り値が戻り値となる

Ruby は引数の()を省略することができる

a.delete 100 do
  'できない'
end
=> "できない"

これは動く

a.delete 100 { 'できない' }
=> syntax error, unexpected '{', expecting end-of-input

結合度が強いとはこういうことらしい

a.delete 100 ではなく 100 { 'できない' } と解釈される

このように引数付きのメソッド呼び出しで{}をブロックとして使う場合は、メソッド引数の()を省略することができない

  • Ruby2.4.0, 2.4.1はRuby側の不具合でエラーが出ない。

普段 {} のほうがワンライナーで書けるーくらいしか思ってなくて、何が違うのかなんて考えたこともなかった…