Zur weiteren Klärung:
Joey sagt, dass das Rückkehrverhalten von Proc.new
überraschend ist. Wenn Sie jedoch bedenken, 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 tatsächlich, warum Procs flexibel sind, wenn es um Arität (Anzahl der Argumente) geht, Lambdas jedoch nicht. Für Blöcke müssen nicht alle Argumente angegeben werden, für Methoden jedoch (sofern kein Standardwert angegeben ist). Während das Bereitstellen der Lambda-Argument-Standardeinstellung in Ruby 1.8 keine Option ist, wird sie jetzt in Ruby 1.9 mit der alternativen Lambda-Syntax (wie von webmat angegeben) unterstützt:
concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1) # => "12"
Und Michiel de Mare (das OP) ist falsch darüber, dass sich Procs und Lambda in Ruby 1.9 mit Arity gleich verhalten. Ich habe überprüft, dass sie das oben angegebene Verhalten von 1.8 beibehalten.
break
Aussagen sind weder in Procs noch in Lambdas sinnvoll. In Procs würde die Pause Sie von Proc.new zurückbringen, das bereits abgeschlossen wurde. Und es macht keinen Sinn, von einem Lambda abzubrechen, da es im Wesentlichen eine Methode ist und Sie niemals von der obersten Ebene einer Methode abbrechen würden.
next
, redo
Und raise
verhalten sich die in beiden Procs und Lambdas. Wobei auch retry
nicht erlaubt ist und eine Ausnahme auslöst.
Und schließlich sollte die proc
Methode niemals verwendet werden, da sie inkonsistent ist und unerwartetes Verhalten aufweist. In Ruby 1.8 wird tatsächlich ein Lambda zurückgegeben! In Ruby 1.9 wurde dies behoben und es wird ein Proc zurückgegeben. Wenn Sie einen Proc erstellen möchten, bleiben Sie bei Proc.new
.
Für weitere Informationen empfehle ich O'Reillys The Ruby Programming Language, die meine Quelle für die meisten dieser Informationen ist.