我这样创建了一个数组:

 arr = Array.new(4, Array.new(4, '*'))

当我尝试更改一个元素时,例如第一个数组的第一个元素:
 arr[0][0] = 3

然后每个元素都会改变。
 print arr
 [[3, "*", "*", "*"], [3, "*", "*", "*"], [3, "*", "*", "*"], [3, "*", "*", "*"]]

有人能解释为什么会这样吗?

最佳答案

做:

arr = Array.new(4) { Array.new(4, '*') }

Ruby数组实际上是一组指针,指向内存中的其他一些对象在代码中,所有指针都指向用Array.new(4, '*')创建的同一对象如果您将传递一个块,而不是值,则将对数组的每个元素执行此块,因此每个指针将指向内存中的一个新对象。
实际上,上面的代码对于字符串“*”仍然有类似的问题。您应该使用相同的方法来修复它:
arr = Array.new(4) { Array.new(4) { '*' } }

关于ruby - 改变数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24107683/

10-11 03:03
查看更多