Вот ответ .
Амперсанд используется для преобразования процедуры в блок, а блока в процедуру.
Я изменил пример, чтобы связатьна ваш случай:
def run_my_code(&my_code)
puts 'before proc'
my_code.call
puts 'after proc'
end
run_my_code { puts "passing a block, accepting a proc"; break}
=> before proc
passing a block, accepting a proc
Как вы можете видеть, он не достиг "после процедуры"
def run_my_code
yield
end
my_proc = Proc.new { puts "passing a proc instead of block"; break}
run_my_code &my_proc
=> passing a proc instead of block
LocalJumpError: break from proc-closure
from (pry):75:in `block in <main>'
Во втором примере у вас есть процесс в результате, процесс прерываетсяс iterator
и возвращает к функции test
.
def iterator(&proc)
puts 'entering iterator'
proc.call
puts 'exiting iterator'
end
def test
puts 'before test'
iterator { puts 'entering proc'; break }
puts 'after test'
end
=>before test
entering iterator
entering proc
after test