Как маршалировать лямбду (Proc) в Ruby?

Asked
Viewd7699

21

Джо Ван Дайк спросил список рассылки Ruby :

Привет,

В Ruby, я думаю, вы не можете маршалировать объект лямбда / proc, верно? Является что возможно на лиспе или других языках?

Что я пытался сделать:

 l = lamda { ... }
Bj.submit "/path/to/ruby/program", :stdin => Marshal.dump(l)
 

Итак, я отправляю BackgroundJob лямбда-объект, содержащий контекст / код, что делать. Но, думаю, это было невозможно. я закончился маршалингом обычного объекта Ruby, содержащего инструкции что делать после запуска программы.

Джо

7 ответов

21

Вы не можете маршалировать Lambda или Proc. Это связано с тем, что оба они считаются замыканиями, что означает, что они закрываются вокруг памяти, в которой они были определены, и могут ссылаться на нее. (Для того, чтобы упорядочить их, вам придется упорядочить всю память, к которой они имели доступ в момент создания.)

Однако, как заметил Гай, вы можете использовать ruby2ruby , чтобы получить строку программа. То есть вы можете упорядочить строку, представляющую код Ruby, а затем повторно оценить ее позже.

3

Попробуйте ruby2ruby