2010-11-28 5 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] } 

私はは、再帰関数を生成するために増強しない第2のラインを望んでいない。代わりに、私はもっとこのようになります機能を生産、@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] } 

をしかし、クローンは手続きオブジェクトでは動作しません。

また、マーシャリングとアンマーシャルを使用する標準のRubyディープコピーハックは、Procsでも動作しません。これを行うにはいくつかの方法がありますか?

答えて

7

cloneProc Sに働くだろうとしても、あなたが望むようにあなたはまだありません前の1に、@fooの新しい値にcloneを呼び出すことと思いますので、それは、あなたを助けないだろう。

代わりに、@fooの古い値を、ラムダが閉じることができるローカル変数に保存するだけです。

例:

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

この方法old_fooaugment_fooが呼び出されたときに@fooが持っていたし、あなたが望むようにすべてがうまくいくことを値を参照します。

関連する問題