pensare in questo modo: Proc.new basta creare un blocco di codice che fa parte della funzione chiamante. proc/lambda crea una funzione anonima con collegamenti speciali. Un po esempi di codice aiuterà:
def foo
f = Proc.new { return "return from foo from inside Proc.new" }
f.call # control leaves foo here
return "return from foo"
end
è equivalente a
def foo
begin
return "return from foo from inside begin/end" }
end
return "return from foo"
end
quindi è chiaro che il ritorno sarà solo tornare dalla funzione 'foo'
in contrasto:
def foo
f = proc { return "return from foo from inside proc" }
f.call # control stasy in foo here
return "return from foo"
end
equivale a (ignorando le associazioni poiché non utilizzate in questo esempio):
def unonymous_proc
return "return from foo from inside proc"
end
def foo
unonymous_proc()
return "return from foo"
end
Quale è chiaramente non verrà restituito da foo e continuare alla successiva istruzione invece.
fonte
2009-09-17 18:29:38
Modificato per menzionare anche il comportamento di lambda – sepp2k
nota, nell'esempio se il prossimo è omesso, il comportamento rimane. –
btw, penso che entrambi abbiamo fatto un ottimo lavoro rispondendo ad una domanda diversa :) sul perché, penso che solo Matz lo sa, molte delle cose che riguardano le chiusure violano il principio della sorpresa minima. –