2

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'" がまったく実行されません。その理由はわかりません。

4

1 に答える 1