2010-11-30 13 views
0

レイヤオブジェクトの配列であるレイヤー というインスタンスオブジェクトがあります。クラスオブジェクトのコピー

私は次のことをしてみてください、と私はクラスメソッドをダンプしようとしているというエラーが出ます:

@best_copy = Marshal.load(Marshal.dump(@layers)) 

TypeError: no marshal_dump is defined for class Method 

attr_accessorを保存しようとしないように、私はそれを作るにはどうすればよいです、 しかし、実際のオブジェクトですか?

答えて

1

レイヤーの1つ以上にメソッドであるインスタンス変数があるようです。それは正しいと思いますか?マーシャリングはオブジェクトmarshal_dumpを送信してマーシャリング用のデータを取得し、オブジェクトの属性もmarshal_dumpを取得してデータを取得します。メソッドをマーシャリングすることはできません。したがって、プロセスがオブジェクトのその部分に到達すると、メソッドがマーシャリングされるまでハングアップします。

+0

ああ、私はちょっと気付きました。私は関数ポインタを持っています。 attr_accessor:fptr。これに代わる方法はありますか?関数のポインタを削除するか、オブジェクトの個々の部分を保存するだけです。 – Flethuseo

+1

@ user487980:一般的なケースでは代替手段はありません。メソッドをマーシャリングすることはできません。インスタンス変数内の実行可能コードを持つオブジェクトは、標準のアーカイブライブラリとはうまく対話しません。最も近い近似は、ターゲット(メソッドを実装するオブジェクト)とセレクタ(メソッドを呼び出すためのメッセージ)を格納するココアのようなシステムです。たとえば、 '@fptr = foo.method(:bar)'を実行している場合は、代わりに '@target = foo;を実行します。 @selector =:bar'。 – Chuck

関連する問題