346 Stimmen

Wann wird Lambda, wann Proc.new verwendet?

In Ruby 1.8 gibt es feine Unterschiede zwischen proc/lambda auf der einen Seite und Proc.new auf der anderen Seite.

  • Worin bestehen diese Unterschiede?
  • Können Sie Hinweise geben, wie man sich für eine der beiden entscheiden kann?
  • In Ruby 1.9 sind proc und lambda unterschiedlich. Was hat es damit auf sich?

3voto

Peeja Punkte 13033

Um auf die Antwort von Accordion Guy einzugehen:

Beachten Sie, dass Proc.new erzeugt einen proc out, indem es einen Block übergeben bekommt. Ich glaube, dass lambda {...} wird als eine Art Literal geparst und nicht als ein Methodenaufruf, der einen Block übergibt. return aus einem Block, der an einen Methodenaufruf angehängt ist, kehrt aus der Methode zurück, nicht aus dem Block, und die Proc.new Fall ist ein Beispiel für diese Vorgehensweise.

(Dies ist 1.8. Ich weiß nicht, wie sich das auf 1.9 übertragen lässt).

3voto

Aleksei Matiushkin Punkte 112439

Ich bin ein bisschen spät dran, aber es gibt eine große, aber wenig bekannte Sache über Proc.new in den Kommentaren überhaupt nicht erwähnt. Wie von Dokumentation :

Proc::new kann ohne Block nur innerhalb einer Methode mit angehängtem Block aufgerufen werden; in diesem Fall wird Block wird in den Proc Objekt.

Davon abgesehen, Proc.new lässt zu, dass die Methoden der Kettennachgiebigkeit:

def m1
  yield 'Finally!' if block_given?
end

def m2
  m1 &Proc.new
end

m2 { |e| puts e } 
# Finally!

3voto

ComDubh Punkte 728

Es ist zu betonen, dass return in einer proc kehrt von der lexikalisch umschließenden Methode zurück, d.h. die Methode, in der der proc erstellt wurde , no die Methode, die die Proc aufgerufen hat. Dies ist eine Folge der Closure-Eigenschaft von Procs. Der folgende Code gibt also nichts aus:

def foo
  proc = Proc.new{return}
  foobar(proc)
  puts 'foo'
end

def foobar(proc)
  proc.call
  puts 'foobar'
end

foo

Obwohl der Prozess in foobar wurde sie erstellt in foo und damit die return Ausgänge foo , nicht nur foobar . Wie Charles Caldwell oben schrieb, hat es etwas von GOTO. Meiner Meinung nach, return ist in einem Block, der in seinem lexikalischen Kontext ausgeführt wird, in Ordnung, ist aber weit weniger intuitiv, wenn es in einem Proc verwendet wird, der in einem anderen Kontext ausgeführt wird.

1voto

Orion Edwards Punkte 117361

Der Unterschied im Verhalten bei return ist IMHO der wichtigste Unterschied zwischen den beiden. Ich bevorzuge auch lambda, weil es weniger Tipparbeit bedeutet als Proc.new :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X