Ответ 1
Как один ответ в связанном вопросе показывает:
Ключевое слово
return
всегда возвращается из метода или лямбда в текущем контексте. В блоках он будет возвращен из метода, в котором было определено замыкание. Нельзя заставить вернуться из метода вызова или лямбда.
Ваш первый пример был успешным, потому что вы определили victor
в той же функции, из которой вы хотели вернуться, поэтому return
был законным в этом контексте. Во втором примере victor
был определен на верхнем уровне. Таким образом, эффект от этого return
будет не возвращаться из batman_yield
(метод вызова), но [если он был действителен] для возврата из самого верхнего уровня (где Proc
).
Уточнение:, пока вы можете получить доступ к возвращаемому значению блока (т.е. "Значение последнего выражения, оцениваемого в блоке, возвращается к методу в качестве значения доходности" - как за ваш комментарий), вы не можете использовать ключевое слово return
по указанной выше причине. Пример:
def batman_yield
value = yield
return value
"Iron man will win!"
end
victor = Proc.new { return "Batman will win!" }
victor2 = Proc.new { "Batman will win!" }
#batman_yield(&victor) === This code throws an error.
puts batman_yield(&victor2) # This code works fine.