Стоит подчеркнуть, что return
в процедуре возвращается из лексически заключенного метода, то есть метода, в котором был создан процесс , , а не метода, который вызвал процедуру. Это является следствием свойства замыкания процедур. Поэтому следующий код ничего не выводит:
def foo
proc = Proc.new{return}
foobar(proc)
puts 'foo'
end
def foobar(proc)
proc.call
puts 'foobar'
end
foo
Хотя процедура выполняется в foobar
, она была создана в foo
, поэтому return
выходит foo
, а не только foobar
. Как Чарльз Колдуэлл писал выше, у этого есть GOTO чувство к этому. На мой взгляд, return
подходит для блока, который выполняется в его лексическом контексте, но гораздо менее интуитивно понятен при использовании в процедуре, выполняемой в другом контексте.