Я хочу, чтобы иметь возможность писать lambda/Proc в моем коде Ruby, сериализуйте его так, чтобы я мог записать его на диск, а затем выполнить lambda позже. Похоже...
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 имеет Data:: Dump:: Streamer, а в Lisp это тривиально. Но есть ли способ сделать это в Ruby? Другими словами, какова будет реализация save
?_
для _
позже
Изменить: Мой ответ ниже хорош, но он не закрывается над свободными переменными (например, x
) и сериализует их вдоль с лямбдой. Итак, в моем примере...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... вывод строки не содержит определения для x
. Есть ли решение, которое учитывает это, возможно, путем сериализации таблицы символов? Вы можете получить доступ к этому в Ruby?
Изменить 2. Я обновил свой ответ, чтобы включить сериализацию локальных переменных. Это кажется приемлемым.