我正在尝试编写自己的转置方法。我想知道不同形式的连接如何影响我的代码。
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]]
为什么它们不能以相同的方式工作?
答案 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
对象。