Ruby多维数组赋值差异

时间:2015-02-23 17:38:06

标签: ruby

有人可以解释这两种情况之间的输出差异:

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创建多维数组时,更改第一行'在每一行都重复?

是否有另一种短格式方法来定义一个没有这种行为的多维数组?

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

这样你就可以在每次迭代时创建一个新的内部数组,它们应该彼此独立。