Как вы структурируете / сериализуете код Ruby?
Я хочу иметь возможность написать лямбда / Proc в своем коде Ruby, сериализовать его, чтобы я мог записать его на диск, а затем выполнить лямбда позже. Вроде как ...
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Позже, в отдельном выпуске интерпретатора Ruby, я хочу сказать ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump не работает для Procs. Я знаю, что PerlДанные :: Свалка :: Streamerи в Лиспе это тривиально. Но есть ли способ сделать это в Ruby? Другими словами, какова будет реализацияsave<code>_</code>for<code>_</code>later
?
редактировать: Мой ответ ниже это хорошо, но не закрывает свободные переменные (например,x
) и сериализовать их вместе с лямбдой. Так что в моем примере ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... вывод строки не содержит определения дляx
, Есть ли решение, которое учитывает это, возможно, путем сериализации таблицы символов? Можете ли вы получить доступ к этому в Ruby?
Редактировать 2: Я обновил свой ответ, чтобы включить сериализацию локальных переменных. Это кажется приемлемым.