有人可以解释这两种情况之间的输出差异:
array = [['a', 'a,'], ['a', 'a']]
# => [['a', 'a,'], ['a', 'a']]
array[0][0] = 'b'
# => 'b'
array
# => [['b', 'a'], ['a', 'a']]
和
array = [['a'] * 2] * 2
# => [['a', 'a,'], ['a', 'a']]
array[0][0] = 'b'
# => 'b'
array
# => [['b', 'a'], ['b', 'a']]
似乎在使用表单[['a'] * 2] * 2
创建多维数组时,更改第一行'在每一行都重复?
是否有另一种短格式方法来定义一个没有这种行为的多维数组?
答案 0 :(得分:3)
您的第二种技术的问题是您正在创建单个数组['a', 'a']
并将其放在array
数组中的两个位置。您需要clone
array
中的项目,因此它们并不是同一个项目。
array = [['a'] * 2] * 2
# => [["a", "a"], ["a", "a"]]
array.map! { |item| item.clone }
# => [["a", "a"], ["a", "a"]]
array[0][0] = 'b'
# => "b"
array
# => [["b", "a"], ["a", "a"]]
答案 1 :(得分:1)
当你编写[['a'] * 2] * 2
时,你正在创建一个数组对象['a', 'a']
,在外部数组中有两个对它的引用。要完成你想要的东西,你必须写作。
array = []
2.times do
array << ['a']*2
end
这样你就可以在每次迭代时创建一个新的内部数组,它们应该彼此独立。