Ну, вы получаете LocalJumpError
, когда вы пытаетесь передать блок с return
на Proc
(в отличие от lambda
).
Вы можете обойтись без изменения foo
за исключением того, как он называется, если вы сделаете что-то вроде
def bar()
Proc.new
end
def foo()
bar do
p "it"
return
end
end
foo[]
Это дает LocalJumpError
.
В любом случае, эта статья может помочь.
Редактировать: return
в процедуре будет возвращаться из внешнего метода, а не из анонимного метода в блоке. Возможно, вы сможете установить флаг, который вы можете проверить в bar
, чтобы увидеть, если он вернулся преждевременно:
bar_finished = false
def bar(&block)
proc = Proc.new &block
l.call
bar_finished = true
end
Тогда, если return
находится в блоке, переданном в bar
, bar_finished
все равно будет ложным. Не уверен, что добавление нелокальной переменной, подобной этой, является опцией, но если это так, вы можете отслеживать возвраты из блока и генерировать любое исключение, которое хотите, если это произойдет.