这是我的代码:
but = Array.new(2, []) # => [[], []]
but[1] << 1
but # => [[1], [1]]
如果我用这个创建一个数组:
but = [[], []]
那么问题就不会发生。但是,我需要包含在but
中的子数组的数量不是一个稳定的变量,我知道Array.new
,循环等的替代方案很麻烦。
为什么会这样?不会but[1] << 1
只影响一个特定的子元素吗?
答案 0 :(得分:1)
因为but
中的第一个子数组和第二个子数组是相同的数组对象。影响第二个子阵列需要第一个子阵列也受到影响。
请注意,参数在传递给它们的方法之前进行评估。在Array.new(2, [])
中,子数组[]
被计算为单个数组对象,然后在新创建的数组中使用两次相同的数组对象。