¿Hay alguna manera directa en Ruby de producir una copia de un Proc?¿Cómo copio en profundidad un Proc en Ruby?
Tengo un Proc llamado @foo
. Quiero otro método para aumentar periódicamente @foo con una lógica adicional. Por ejemplo:
# create initial Proc
@foo = lambda { |x| x }
# augment with more logic
@foo = lambda { |x| x > 1 ? x*x : @foo[x] }
I No quieren que la segunda línea que hace el aumento de producir una función recursiva. En cambio, quiero @foo en obligarse por el valor en el ámbito léxico de la nueva definición @foo, produciendo una función que se parece más a esto:
@foo = lambda { |x| x > 1 ? x*x : lambda{ |x| x }[x] }
Obtengo un bucle infinito y un eventual desbordamiento de pila en su lugar, debido a la función resultante con este aspecto:
@foo = lambda { |x| x > 1 ? x*x : lambda { |x| x > 1 ? x*x : { lambda |x| # etc...
me gustaría que el código sea así:
# augment with more logic
@foo = lambda { |x| x > 1 ? x*x : (@foo.clone)[x] }
pero clon no funciona en Proc.
Además, el hack estándar de copia profunda de Ruby, usando Marshal y Unmarshal, tampoco funciona en Procs. Hay alguna manera de hacer esto?