3

誰かがこれを説明できますか?

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

出力:

[[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
[[" ", " ", "x"], [" ", " ", "x"], [" ", " ", "x"]]

私の理解では、block [1] [2]は行1の列2のセルのみを変更しますが、なぜ列2のすべてのセルを変更するのでしょうか。

4

2 に答える 2

6
  for i in 0...row
    # you are pushing the same array object to an array
    a.push r
  end

したがって、のすべての要素blockは同じオブジェクトです。

block[0] === block[1]  # true
block[1] === block[2]  # true

アップデート:

要素ごとに新しい配列を作成する必要があります。コードは次のように書き直すことができます。

def digit_block(size = 1)
  Array.new(1 + 2*size){Array.new(2 + size){' '}}
end
于 2012-10-12T05:19:57.870 に答える
0

単一の配列のみを生成していrます。それを複数の場所で使用しても、それらのアイデンティティは同じです。ある場所で変更すると、他の場所の同じオブジェクトに影響します。タイトルの質問に答えるには、行ごとに異なる配列を作成する必要があります。

def digit_block(size = 1)
  col = 2 + 1*size
  row = 1 + 2*size
  a = []
  for i in 0...row
    # For every iteration of the loop, the code here is evaluated,
    #  which means that the r is newly created for each row.
    r = []
    for i in 0...col
      r.push ' '
    end
    a.push r
  end
  a
end
于 2012-10-12T05:28:43.103 に答える