红宝石中串联类型的区别

时间:2015-10-12 04:05:47

标签: ruby loops concatenation

我正在尝试编写自己的转置方法。我想知道不同形式的连接如何影响我的代码。

multi = [[1,3,5],[2,4,6],[7,9,8]]
new = Array.new(multi.length, [])
multi.each do |c|
    c.each_with_index do |x,y|
        new[y] += [x]
    end
end
new #=> [[1, 3, 5], [2, 4, 6], [7, 9, 8]]
multi = [[1,3,5],[2,4,6],[7,9,8]]
new = Array.new(multi.length, [])
multi.each do |c|
    c.each_with_index do |x,y|
        new[y] << x
    end
end
new #=> [[1, 3, 5, 2, 4, 6, 7, 9, 8], [1, 3, 5, 2, 4, 6, 7, 9, 8], [1, 3, 5, 2, 4, 6, 7, 9, 8]]

为什么它们不能以相同的方式工作?

1 个答案:

答案 0 :(得分:5)

dlspeed

new = Array.new(multi.length, []) # => [[], [], []] 中的元素引用相同的new个对象。检查他们的身份:

Array

第一个代码段为您提供了预期的结果,因为new.map {|e| e.object_id} # => [1625920, 1625920, 1625920] new[y] += [x]分配了一个新的new[y]对象,因此Array中的每个元素现在都没有引用同一个对象:

new

使用第二个代码段,new.map {|e| e.object_id} # => [22798480, 22798440, 22798400] 中的每个元素仍然引用原始new对象。