Почему оператор break в ruby ведет себя по-разному при использовании Proc.new v. Знак амперсанда?
Оператор перерыва для блоков (согласноЯзык программирования Ruby) определяется следующим образом:
он заставляет блок возвращаться к своему итератору, а итератор - к методу, который его вызвал.
Поэтому, когда выполняется следующий код, он приводит к LocalJumpError.
def test
puts "entering test method"
proc = Proc.new { puts "entering proc"; break }
proc.call # LocalJumpError: iterator has already returned
puts "exiting test method"
end
test
Хотя следующий кодне бросить LocalJumpError. Что особенного в знаке амперсанда? Разве знак амперсанда неявно использует Proc.new?
def iterator(&proc)
puts "entering iterator"
proc.call # invoke the proc
puts "exiting iterator" # Never executed if the proc breaks
end
def test
iterator { puts "entering proc"; break }
end
test
Другими словами, я читаю знак амперсанда как средство включения вызова Proc.new. В этот момент поведение должно быть таким же, как в первом фрагменте кода.
def iterator (p = Proc.new { puts "entering proc"; break})
...
end
отказ: Я новичок в изучении языка (ruby 1.9.2), и поэтому буду благодарен за ссылки и подробный синопсис.