簡體   English   中英

如何深入復制Ruby中的Proc?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM