Um weitere Klarheit zu schaffen:
Joey sagt, dass das Rückgabeverhalten von Proc.new
ist überraschend. Wenn man jedoch bedenkt, dass sich Proc.new wie ein Block verhält, ist dies nicht überraschend, da sich Blöcke genau so verhalten. lambas hingegen verhalten sich eher wie Methoden.
Dies erklärt, warum Procs in Bezug auf die Arithmetik (Anzahl der Argumente) flexibel sind, während Lambdas dies nicht sind. Bei Blöcken müssen nicht alle Argumente angegeben werden, bei Methoden schon (es sei denn, es wird ein Standardwert angegeben). Während die Angabe von Lambda-Argumenten in Ruby 1.8 keine Option ist, wird sie in Ruby 1.9 mit der alternativen Lambda-Syntax unterstützt (wie von webmat erwähnt):
concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1) # => "12"
Und Michiel de Mare (der OP) ist falsch über die Procs und Lambda verhalten sich die gleichen mit Arität in Ruby 1.9. Ich habe überprüft, dass sie immer noch das Verhalten von 1.8 wie oben angegeben beibehalten.
break
Anweisungen machen weder in Procs noch in Lambdas wirklich viel Sinn. In Procs würde die Pause Sie von Proc.new zurückbringen, das bereits abgeschlossen ist. Und es macht keinen Sinn, von einem Lambda abzubrechen, da es im Grunde eine Methode ist, und man würde niemals von der obersten Ebene einer Methode abbrechen.
next
, redo
y raise
verhalten sich in Procs und Lambdas gleich. Während retry
ist in beiden nicht erlaubt und führt zu einer Ausnahme.
Und schließlich, die proc
Methode sollte niemals verwendet werden, da sie inkonsistent ist und ein unerwartetes Verhalten zeigt. In Ruby 1.8 gibt sie tatsächlich ein Lambda zurück! In Ruby 1.9 wurde dies behoben und sie gibt eine Proc zurück. Wenn Sie eine Proc erstellen wollen, bleiben Sie bei Proc.new
.
Für weitere Informationen empfehle ich das Buch von O'Reilly Die Ruby-Programmiersprache die meine Quelle für die meisten dieser Informationen ist.