ruby が yield ステートメントと return ステートメントをどのように処理するかを理解しようとしているところ、return ステートメントを含むブロックの yield が違法である場合もあれば、機能する場合もあることに気付きました。私が苦労している次の例があります。
def foo
yield
end
def bar
foo do
return 'asdf'
end
end
上記の場合、次のことが失敗することがわかっています。
foo do
return 'asdf'
end
> LocalJumpError: unexpected return
ただし、次は機能します (ただし、「asdf」ではなく nil が返されます)。
bar
=> nil
私の質問は、似ているように見えるコードの断片が、なぜそれほど異なる反応を示すのでしょうか? return ブロックがメソッドコンテキストを実行する必要があるためですか? さらに微妙な状況は次のとおりです
def baz
yield
puts 'Hi'
end
def bif
baz do
return 'asdf'
end
end
bif
=> nil
yield の後の "puts 'Hi'" がまったく実行されません。その理由はわかりません。