我的应用程序中有一个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