Думайте об этом так: Proc.new просто создайте блок кода, который является частью вызывающей функции. proc / lambda создает анонимную функцию, которая имеет специальные привязки. Небольшой пример кода поможет:
def foo
f = Proc.new { return "return from foo from inside Proc.new" }
f.call # control leaves foo here
return "return from foo"
end
эквивалентно
def foo
begin
return "return from foo from inside begin/end" }
end
return "return from foo"
end
так что ясно, что return просто вернется из функции 'foo'
для сравнения:
def foo
f = proc { return "return from foo from inside proc" }
f.call # control stasy in foo here
return "return from foo"
end
эквивалентно (игнорируя привязки, поскольку не используется в этом примере):
def unonymous_proc
return "return from foo from inside proc"
end
def foo
unonymous_proc()
return "return from foo"
end
То, что так же явно не вернется из foo и перейдет к следующему утверждению.