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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage