作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在 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
将引用 @foo
在 augment_foo
被调用时所拥有的值,一切都会如您所愿。
关于ruby - 如何在 Ruby 中深度复制 Proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4298652/
我是一名优秀的程序员,十分优秀!