[英]How do I deep copy a Proc in Ruby?
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被值綁定到新的@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
,它也無濟於事,因為你仍然會在@foo
的新值上調用clone
,而不是像你想要的那樣在前一個上調用clone
。
你可以做的只是將@foo
的舊值存儲在lambda可以關閉的局部變量中。
例:
def augment_foo()
old_foo = @foo
@foo = lambda { |x| x > 1 ? x*x : old_foo[x] }
end
這樣old_foo
將引用augment_foo
在調用@foo
具有的值,並且一切都將按您的意願工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.