1

アプリケーションにKillerSudokuクラスがあります。

すべてのインスタンスには、 に多数のセルがあり@cells、 に多数のゾーンが@zonesあります。

すべての「サブオブジェクト」をコピーするオブジェクト (数独) を簡単にコピーする方法はありますか?

4

1 に答える 1

3

すべてのパーツがによってシリアル化可能で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
于 2012-05-04T19:47:03.147 に答える