アプリケーションにKillerSudoku
クラスがあります。
すべてのインスタンスには、 に多数のセルがあり@cells
、 に多数のゾーンが@zones
あります。
すべての「サブオブジェクト」をコピーするオブジェクト (数独) を簡単にコピーする方法はありますか?
アプリケーションにKillerSudoku
クラスがあります。
すべてのインスタンスには、 に多数のセルがあり@cells
、 に多数のゾーンが@zones
あります。
すべての「サブオブジェクト」をコピーするオブジェクト (数独) を簡単にコピーする方法はありますか?
すべてのパーツがによってシリアル化可能でMarshal
あり、完全に深いクローンが必要であると仮定します。
class Object
# This doesn't have to be on Object; it could be on KillerSudoku instead
def deep_clone
Marshal.load(Marshal.dump(self))
end
end
実際に見られる:
class KillerSudoku
attr_accessor :cells
end
ks1 = KillerSudoku.new
ks1.cells = ["one",2,3]
ks2 = ks1.deep_clone
ks2.cells.pop
ks2.cells.first.reverse!
p ks1.cells, ks2.cells
#=> ["one", 2, 3]
#=> ["eno", 2] # New array with all instance values being uniq, too
ドキュメントから、構造に次のいずれかがある場合、上記は機能しません。
匿名Class
またはModule
。
Dir
システムに関連するオブジェクト(例、、、、、File::Stat
など)IO
File
Socket
、、、、、、、、のインスタンスMatchData
_ Data
_ Method
_ UnboundMethod
_ Proc
_Thread
ThreadGroup
Continuation
シングルトンメソッドを定義するオブジェクト
上で見たように、これは本当に深いクローンであり、文字列でさえ新しいインスタンスになります。セルとゾーンの配列を複製したいが、すべての値が同じオブジェクトを参照している場合は、次を使用して何dup
を実行するかをカスタマイズします。clone
initialize_copy
class KillerSudoku
attr_accessor :cells
def initialize_copy(old)
self.cells = old.cells.dup
end
end
実際に見られる:
ks1 = KillerSudoku.new
ks1.cells = ["one",2,3]
ks2 = ks1.clone
ks2.cells.pop
ks2.cells.first.reverse!
p ks1.cells, ks2.cells
#=> ["eno", 2, 3]
#=> ["eno", 2] # New array that references all the same objects