アプリケーションに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など)IOFileSocket
、、、、、、、、のインスタンスMatchData_ Data_ Method_ UnboundMethod_ Proc_ThreadThreadGroupContinuation
シングルトンメソッドを定義するオブジェクト
上で見たように、これは本当に深いクローンであり、文字列でさえ新しいインスタンスになります。セルとゾーンの配列を複製したいが、すべての値が同じオブジェクトを参照している場合は、次を使用して何dupを実行するかをカスタマイズします。cloneinitialize_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