我在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/

10-10 06:33