2010-11-28 66 views
8

Ruby中有直接的方法來生成一個Proc的副本嗎?如何在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] } 

但克隆不上的特效工作。

此外,使用編組和解組的標準紅寶石深度複製破解不適用於Proc。有沒有辦法做到這一點?

回答

7

即使clone將在Proc的工作,它不會幫助你,因爲你仍然可以對@foo新值調用clone,而不是以前的人喜歡你想要的。

你可以做的只是將舊值@foo存儲在lambda可關閉的局部變量中。

例子:

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

這樣old_foo將參考值@foo已經當augment_foo被稱爲這樣就可以了,只要你想。