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"される