Pentru a oferi clarificări suplimentare:
Joey spune că comportamentul de revenire al Proc.new
este surprinzător. Cu toate acestea, atunci când considerați că Proc.new se comportă ca un bloc, acest lucru nu este surprinzător, deoarece exact așa se comportă blocurile. lambas, pe de altă parte, se comportă mai mult ca metodele.
Acest lucru explică de ce Procs sunt flexibile când vine vorba de arity (numărul de argumente), în timp ce lambda nu este. Blocurile nu necesită furnizarea tuturor argumentelor acestora, dar metodele fac (cu excepția cazului în care este furnizată o prestație implicită). În timp ce furnizarea default lambda argument nu este o opțiune în ruby 1.8, este acum susținută în ruby 1.9 cu sintaxa lambda alternativă (așa cum a remarcat webmat):
concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1) # => "12"
Și Michiel de Mare (OP) este incorect în legătură cu Procs și lambda care se comportă la fel cu arity în ruby 1.9. Am verificat că ei încă mențin comportamentul de la 1.8 așa cum este specificat mai sus.
break
statements don't actually make much sense in either Procs or lambdas. In Procs, the break would return you from Proc.new which has already been completed. And it doesn't make any sense to break from a lambda since it's essentially a method, and you would never break from the top level of a method.
next
, redo
, and raise
behave the same in both Procs and lambdas. Whereas retry
is not allowed in either and will raise an exception.
În cele din urmă, metoda proc
nu ar trebui folosită niciodată deoarece este incoerentă și are un comportament neașteptat. În ruby 1.8 se întoarce de fapt o lambda! În ruby 1.9 aceasta a fost rezolvată și ea returnează un Proc. Dacă doriți să creați un Proc, stick cu Proc.new
.
Pentru mai multe informații, recomand foarte mult limbajul de programare ruby al O'Reilly, care este sursa mea pentru majoritatea acestor informații.