Wie kann ich einen Proc in Ruby tief kopieren?

8

Gibt es einen einfachen Weg in Ruby, um eine Kopie eines Procs zu erzeugen?

Ich habe einen Proc namens @foo . Ich möchte eine andere Methode, @foo mit zusätzlicher Logik zu ergänzen. Zum Beispiel:

%Vor%

I nicht möchte die zweite Zeile, die die Augmentierung eine rekursive Funktion erzeugt. Stattdessen möchte ich, dass @foo durch den Wert in den lexikalischen Bereich der neuen @ foo-Definition eingebunden wird, wodurch eine Funktion entsteht, die eher wie folgt aussieht:

%Vor%

Ich bekomme stattdessen eine unendliche Rekursion und einen eventuellen Stack-Überlauf, weil die resultierende Funktion so aussieht:

%Vor%

Ich möchte, dass der Code so ist:

%Vor%

aber Klon funktioniert nicht mit Procs.

Außerdem funktioniert der standardmäßige Ruby-Deep-Copy-Hack mit Marshal und Unmarshal auch nicht mit Procs. Gibt es einen Weg, dies zu tun?

    
sgibbons 28.11.2010, 19:42
quelle

1 Antwort

7

Selbst wenn clone auf Proc s funktionieren würde, würde es Ihnen nicht weiterhelfen, denn Sie würden immer noch clone auf dem neuen Wert von @foo aufrufen, nicht auf der vorherigen, wie Sie wollen .

Sie können stattdessen nur den alten Wert von @foo in einer lokalen Variablen speichern, die das Lambda schließen kann.

Beispiel:

%Vor%

Auf diese Weise bezieht sich old_foo auf den Wert, den @foo hatte, wenn augment_foo aufgerufen wurde und alles wie gewünscht funktioniert.

    
sepp2k 28.11.2010, 19:58
quelle

Tags und Links