Есть ли в Ruby простой способ создания копии Proc?
У меня есть проц, который называется @foo
. Я хочу, чтобы другой метод периодически дополнял @foo дополнительной логикой. Например:
# create initial Proc
@foo = lambda { |x| x }
# augment with more logic
@foo = lambda { |x| x > 1 ? x*x : @foo[x] }
Я не хочу, чтобы вторая строка, которая выполняет увеличение, производила рекурсивную функцию. Вместо этого я хочу, чтобы значение @foo было связано со значением в лексической области нового определения @foo, создавая функцию, которая выглядит примерно так:
@foo = lambda { |x| x > 1 ? x*x : lambda{ |x| x }[x] }
Вместо этого я получаю бесконечную рекурсию и возможное переполнение стека, потому что получающаяся функция выглядит следующим образом:
@foo = lambda { |x| x > 1 ? x*x : lambda { |x| x > 1 ? x*x : { lambda |x| # etc...
Я бы хотел, чтобы код был таким:
# augment with more logic
@foo = lambda { |x| x > 1 ? x*x : (@foo.clone)[x] }
но клон не работает на Procs.
Кроме того, стандартный хак глубокого копирования Ruby, использующий маршал и демаршал, также не работает на Procs. Есть ли способ сделать это?