【发布时间】:2017-01-20 23:03:14
【问题描述】:
我在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"]]
【问题讨论】:
-
array.map(&:dup)已经足够好了,因为 map 无论如何都会创建一个副本,额外的 dup 是我其他答案中的错字