Wie wird Ruby-Code stringiert / serialisiert?
Ich möchte in der Lage sein, ein Lambda / Proc in meinen Ruby-Code zu schreiben, es zu serialisieren, damit ich es auf die Festplatte schreiben und das Lambda später ausführen kann. So in etwa wie...
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Später, in einem separaten Durchlauf des Ruby-Interpreters, möchte ich sagen können ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump funktioniert nicht für Procs. Ich weiß, dass Perl hatDaten :: Dump :: Streamerund in Lisp ist das trivial. Aber gibt es eine Möglichkeit, dies in Ruby zu tun? Mit anderen Worten, was wäre die Implementierung vonsave<code>_</code>for<code>_</code>later
?
Bearbeiten: Meine Antwort unten ist nett, aber es schließt nicht über freie Variablen (wiex
) und serialisieren Sie sie zusammen mit dem Lambda. Also in meinem Beispiel ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... die String-Ausgabe enthält keine Definition fürx
. Gibt es eine Lösung, die dies berücksichtigt, beispielsweise durch Serialisierung der Symboltabelle? Können Sie in Ruby darauf zugreifen?
Bearbeiten 2: Ich habe meine Antwort aktualisiert, um die Serialisierung lokaler Variablen einzubeziehen. Dies scheint akzeptabel.