Оператор разрыва для блоков (согласно определяется как "rel =" язык "nnoreming" = "rel ="
он заставляет блок вернуться к своему итератору, а итератор - к методу, который его вызвал.
Поэтому при запуске следующего кода возникает ошибка 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), поэтому буду благодарен за ссылки и подробный синопсис.
class Proc; def self.new(&b); b; end; end
. Но вы не можете реализовать свой собственный основной синтаксис (кроме взлома интерпретатора или использования препроцессора). 25.01.2012