代码之家  ›  专栏  ›  技术社区  ›  sgibbons

如何在Ruby中深度复制过程?

  •  8
  • sgibbons  · 技术社区  · 15 年前

    在Ruby中,有没有一种直接的方法来生成过程的副本?

    我有一个程序叫 @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。

    另外,使用marshal和unmashal的标准RubyDeepcopyHack也不适用于proc。有什么办法吗?

    1 回复  |  直到 15 年前
        1
  •  7
  •   sepp2k    15 年前

    即使 clone 会努力的 Proc S,这对你没有帮助,因为你还在打电话 克隆 关于 @foo 不是你想要的上一个。

    你所能做的只是存储 @福 在lambda可以关闭的局部变量中。

    例子:

    def augment_foo()
      old_foo = @foo
      @foo = lambda { |x| x > 1 ? x*x : old_foo[x] }
    end
    

    这种方式 old_foo 将引用 @福 有什么时候 augment_foo 我们打电话来了,一切都会按你的意愿进行。

    推荐文章