Rubyのdo … end
と { … }
はどちらもブロックを表すが、文法としての結合度が違う。
hoge = 123
def hoge(fuga = nil)
puts fuga
yield if block_given?
end
hoge hoge do "hoge" end
# => 123
hoge hoge { "hoge" }
# =>
# hoge
do … end
の方は結合度が弱いのでhoge(hoge) do … end
として解釈される- なのでputs hoge(=変数)するだけ
{ … }
の方は結合度が強いのでhoge(hoge() { … })
として解釈される- 内部のhoge呼び出しでputs nilして、yieldのreturnを外側のhogeでputsするのでputs “hoge”される