Lambda funktioniert wie erwartet, wie in anderen Sprachen.
Die verkabelte Proc.new
ist überraschend und verwirrend.
En return
Anweisung in proc created by Proc.new
nicht nur die Kontrolle über sich selbst zurück, sondern auch von der sie einschließenden Methode .
def some_method
myproc = Proc.new {return "End."}
myproc.call
# Any code below will not get executed!
# ...
end
Sie können argumentieren, dass Proc.new
fügt Code in die einschließende Methode ein, genau wie block. Aber Proc.new
erzeugt ein Objekt, während Block Teil von ein Objekt.
Und es gibt noch einen weiteren Unterschied zwischen lambda und Proc.new
das ist ihr Umgang mit (falschen) Argumenten. lambda beschwert sich darüber, während Proc.new
ignoriert zusätzliche Argumente oder betrachtet das Fehlen von Argumenten als Null.
irb(main):021:0> l = -> (x) { x.to_s }
=> #<Proc:0x8b63750@(irb):21 (lambda)>
irb(main):022:0> p = Proc.new { |x| x.to_s}
=> #<Proc:0x8b59494@(irb):22>
irb(main):025:0> l.call
ArgumentError: wrong number of arguments (0 for 1)
from (irb):21:in `block in irb_binding'
from (irb):25:in `call'
from (irb):25
from /usr/bin/irb:11:in `<main>'
irb(main):026:0> p.call
=> ""
irb(main):049:0> l.call 1, 2
ArgumentError: wrong number of arguments (2 for 1)
from (irb):47:in `block in irb_binding'
from (irb):49:in `call'
from (irb):49
from /usr/bin/irb:11:in `<main>'
irb(main):050:0> p.call 1, 2
=> "1"
ÜBRIGENS, proc
in Ruby 1.8 erzeugt ein Lambda, während es sich in Ruby 1.9+ wie Proc.new
was wirklich verwirrend ist.