For å gi ytterligere avklaring:
Joey sier at avkastningen oppførsel Proc.new
er overraskende. Men når du tenker på at Proc.new oppfører seg som en blokk dette er ikke overraskende ettersom det er nøyaktig hvordan blokker oppføre seg. lambas derimot oppfører seg mer som metoder.
Dette forklarer egentlig hvorfor Procs er fleksible når det gjelder å arity (antall argumenter), mens lambdaene ikke. Blokker krever ikke alle deres argumenter for å bli gitt, men metoder gjøre (med mindre en standard er oppgitt). Samtidig som lambda argument standard er ikke et alternativ i Ruby 1,8, er det nå støttet i Ruby 1.9 med den alternative syntaksen lambda (som nevnt av webmat):
concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1) # => "12"
Og Michiel de Mare (OP) er feil om Procs og lambda oppfører det samme med arity i Ruby 1.9. Jeg har bekreftet at de fortsatt opprettholde atferd fra 1,8 som angitt ovenfor.
break
uttalelser faktisk ikke mye mening i enten Procs eller lambdaene. I Procs, ville pause returnere deg fra Proc.new som allerede er gjennomført. Og det gjør ikke noe fornuftig å bryte fra en lambda siden det er egentlig en metode, og du ville aldri bryte fra det øverste nivået i en metode.
next
, redo
Og raise
oppfører den samme i begge Procs og lambdaene. Mens retry
er ikke tillatt i heller, og vil heve et unntak.
Og til slutt, proc
bør aldri brukes metoden som det er inkonsekvent og har uventet oppførsel. I Ruby 1.8 det faktisk returnerer en lambda! I Ruby 1,9 dette har blitt fikset, og den returnerer en Proc. Hvis du ønsker å opprette en Proc, stokk med Proc.new
.
For mer informasjon, jeg anbefaler O'Reillys programmeringsspråket Ruby som er min kilde for det meste av denne informasjonen.