我在another answer中读到,最好使用array.map(&:dup)
:
不要使用封送处理技巧,除非您真的想深入复制整个对象图。通常只复制数组,而不复制包含的元素。
希望看到一个例子来说明这两种方法之间的区别。
除了语法,在我看来他们也在做同样的事情。
想进一步了解Marshal
和#dup
之间的区别。
arr = [ [['foo']], ['bar']]
foo = arr.clone
p arr #=> [[["foo"]], ["bar"]]
p foo #=> [[["foo"]], ["bar"]]
foo[0][0] = 42
p arr #=> [[42], ["bar"]]
p foo #=> [[42], ["bar"]]
arr = [ [['foo']], ['bar']]
foo = Marshal.load Marshal.dump arr
p arr #=> [[["foo"]], ["bar"]]
p foo #=> [[["foo"]], ["bar"]]
foo[0][0] = 42
p arr #=> [[["foo"]], ["bar"]]
p foo #=> [[42], ["bar"]]
arr = [ [['foo']], ['bar']]
foo = arr.map(&:dup)
p arr #=> [[["foo"]], ["bar"]]
p foo #=> [[["foo"]], ["bar"]]
foo[0][0] = 42
p arr #=> [[["foo"]], ["bar"]]
p foo #=> [[42], ["bar"]]
最佳答案
marshal技巧还克隆数组的元素
array = [[Object.new]]
在复制前后检查元素的
object_id
。array.first.first.object_id
# => 70251489489120
array.map(&:dup).first.first.object_id
# => 70251489489120 -- the same
(Marshal.load Marshal.dump array).first.first.object_id
# => 70251472965580 -- different object!
不要使用封送处理技巧,除非您真的想深入复制整个对象图。通常只复制数组,而不复制包含的元素。
关于arrays - Marshal.load Marshal.dump array和array.map(&:dup)之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41773763/