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

从文档中,如果您的结构中有以下任何内容,则上述内容将不起作用:

  • 匿名ClassModule.

  • 与系统相关的对象(例如Dir, File::Stat, IO, File, Socket, 等)

  • MatchData, Data, Method, UnboundMethod, Proc, Thread, ThreadGroup,的一个实例Continuation

  • 定义单例方法的对象


如上所示,这是一个真正的深度克隆,甚至字符串也成为新的实例。如果您希望克隆单元格和区域的数组,但所有值仍引用相同的对象,那么您希望通过使用自定义内容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 回答