Je veux être capable d'écrire un lambda/Proc dans mon code Ruby, le sérialiser pour que je puisse l'écrire sur le disque, puis exécuter le lambda plus tard. Un peu comme ...Comment pouvez-vous sérialiser/sérialiser le code Ruby?
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Plus tard, dans une course séparée de l'interpréteur Ruby, je veux pouvoir dire ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump ne fonctionne pas pour procs. Je sais que Perl a Data::Dump::Streamer, et en Lisp c'est trivial. Mais y a-t-il un moyen de le faire dans Ruby? En d'autres termes, quelle serait la mise en œuvre de save
?_
pour _
plus tard
Modifier: My answer below est agréable, mais il ne se ferme pas sur les variables libres (comme x
) et sérialisation avec le lambda. Donc, dans mon exemple ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... la sortie de chaîne ne comprend pas une définition pour x
. Existe-t-il une solution qui en tienne compte, peut-être en sérialisant la table des symboles? Pouvez-vous accéder à cela dans Ruby?
Édition 2: J'ai mis à jour ma réponse pour incorporer les variables locales de sérialisation. Cela semble acceptable.
Ma version de Ruby2Ruby (1.2.4) ne semble pas avoir de méthode de traduction. Y a-t-il une API différente pour cela dans les nouvelles versions? –
Je ne comprends pas très bien, mais [ce thread] (http://stackoverflow.com/questions/1144906/error-running-heckle-currentcode-undefined-method-translate-for-ruby2ruby) recommande de revenir à Ruby2Ruby 1.2 .2. J'ai également trouvé [ce patch de singe] (http://gist.github.com/321038) qui prétend l'ajouter à des versions ultérieures. Je n'ai pas essayé cependant. –
Il craint que cela ne fonctionne pas avec Ruby 1.9 ... – Kludge