Rubyのdo ... end{ ... } はどちらもブロックを表すが、文法としての結合度が違う。

  • do ... endの方は結合度が弱いのでhoge(hoge) do ... endとして解釈される
    • なのでputs hoge(=変数)するだけ
  • { ... }の方は結合度が強いのでhoge(hoge() { ... })として解釈される
    • 内部のhoge呼び出しでputs nilして、yieldのreturnを外側のhogeでputsするのでputs “hoge”される

参考URL