我用这种方式创建了一个数组:
arr = Array.new(4, Array.new(4, '*'))
当我尝试更改一个元素时,例如第一个数组的第一个元素:
arr[0][0] = 3
然后更改每个第一个元素。
print arr
[[3, "*", "*", "*"], [3, "*", "*", "*"], [3, "*", "*", "*"], [3, "*", "*", "*"]]
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
执行:
arr = Array.new(4) { Array.new(4, '*') }
Ruby数组实际上是一组指针,指向内存中的其他一些对象。在您的代码中,所有指针都指向使用Array.new(4, '*')
创建的同一对象。如果,而不是值,你将传递一个块,这个块将被执行为数组的每个元素,因此每个指针将指向内存中的一个新对象。
事实上,上面的代码仍然存在与字符串' *'类似的问题。您应该使用相同的方法来修复它:
arr = Array.new(4) { Array.new(4) { '*' } }