Rubyのensure節の挙動

Ruby技術者認定試験の対象バージョンがRuby 3.1.xになったので、試験勉強していて気づいた挙動をブログにメモっておく。

ensure節の値は無視される

ensure 節が存在する時は begin 式を終了する直前に必ず ensure 節の本体を評価します。
begin式全体の評価値は、本体/rescue節/else節のうち最後に評価された文の値です。また各節において文が存在しなかったときの値はnilです。いずれにしてもensure節の値は無視されます。

引用: https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html

def foo
  "foo"
ensure
  puts "ensure"

  "bar"
end

puts foo
#=> ensure
#=> foo

ensure節にreturnがあると無視されない

def foo
  "foo"
ensure
  puts "ensure"

  return "bar"
end

puts foo
#=> ensure
#=> bar