如何更改ruby 2d阵列中的一个单元格?

AZ.*_*AZ. 3 ruby

有人可以解释一下吗?

def digit_block(size = 1)
  col = 2 + 1*size
  row = 1 + 2*size
  r = []
  for i in 0...col
    r.push ' '
  end
  a = []
  for i in 0...row
    a.push r
  end
  a
end

block = digit_block
puts block.inspect
block[1][2] = 'x'
puts block.inspect
Run Code Online (Sandbox Code Playgroud)

输出:

[[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
[[" ", " ", "x"], [" ", " ", "x"], [" ", " ", "x"]]
Run Code Online (Sandbox Code Playgroud)

我的理解是块[1] [2]只更改第1行第2列的单元格,但为什么它会更改第2列中的所有单元格?

xda*_*azz 6

  for i in 0...row
    # you are pushing the same array object to an array
    a.push r
  end
Run Code Online (Sandbox Code Playgroud)

所以每个元素block都是同一个对象.

block[0] === block[1]  # true
block[1] === block[2]  # true
Run Code Online (Sandbox Code Playgroud)

更新:

你需要为每个元素创建一个新数组,你的代码可以重写如下:

def digit_block(size = 1)
  Array.new(1 + 2*size){Array.new(2 + size){' '}}
end
Run Code Online (Sandbox Code Playgroud)