gpt4 book ai didi

ruby - 如何在 Ruby 中深度复制 Proc?

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:13 27 4
gpt4 key购买 nike

在 Ruby 中是否有直接的方法来生成 Proc 的副本?

我有一个名为 @foo 的 Proc。我想要另一种方法来定期增加 @foo 的附加逻辑。例如:

# create initial Proc
@foo = lambda { |x| x }

# augment with more logic
@foo = lambda { |x| x > 1 ? x*x : @foo[x] }

希望进行扩充的第二行生成递归函数。相反,我希望 @foo 按值绑定(bind)到新的 @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 和 unmarshal 的标准 Ruby 深度复制 hack 也不适用于 Procs。有什么方法可以做到这一点吗?

最佳答案

即使 clone 可以在 Proc 上工作,它也帮不了你,因为你仍然会在 clone 上调用@foo 的新值,而不是您想要的前一个值。

您可以做的只是将 @foo 的旧值存储在 lambda 可以关闭的局部变量中。

例子:

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

这样,old_foo 将引用 @fooaugment_foo 被调用时所拥有的值,一切都会如您所愿。

关于ruby - 如何在 Ruby 中深度复制 Proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4298652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com