W jaki sposób ciągnąć / serializować kod Ruby?
Chcę być w stanie napisać lambda / Proc w moim kodzie Ruby, serializować go, aby móc zapisać go na dysku, a następnie wykonać lambdę później. Coś w rodzaju...
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Później, w oddzielnym uruchomieniu interpretera Ruby, chcę móc powiedzieć ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump nie działa dla Procs. Wiem, że Perl maDane :: Dump :: Streamer, aw Lisp jest to trywialne. Ale czy można to zrobić w Ruby? Innymi słowy, jaka byłaby realizacjasave<code>_</code>for<code>_</code>later
?
Edytować: Moja odpowiedź poniżej jest ładny, ale nie zamyka się na wolnych zmiennych (jakx
) i serializować je razem z lambda. Więc w moim przykładzie ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... wyjście łańcucha nie zawiera definicji dlax
. Czy istnieje rozwiązanie, które bierze to pod uwagę, być może poprzez serializację tabeli symboli? Czy możesz uzyskać do niego dostęp w Ruby?
Edytuj 2: Zaktualizowałem swoją odpowiedź, aby włączyć serializowanie zmiennych lokalnych. To wydaje się do przyjęcia.