Ruby嵌套for循环以填充数组数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby嵌套for循环以填充数组数组相关的知识,希望对你有一定的参考价值。

我试图通过编码康威的生命游戏来教自己Ruby。

我学习数组如何工作的初步步骤之一是创建一个Cell对象数组数组,定义如下:

class Cell
  def initialize(status, xpos, ypos)
    @status = status
    @position = [xpos,ypos]
  end
end

contents = Array.new(10, Array.new(10))

for i in 0..contents.length-1
  for j in 0..9
    contents.at(i).insert(j, Cell.new("DEAD", i, j))
  end
end

我希望<code>contents</code>是一个10号阵列(它是),其中每个内部数组的大小也是10;但是每个内部阵列的最终尺寸为110,为什么呢?

编辑

所以我的主要问题似乎是误解了插件是如何工作的。我已经将我的代码更改为:

class Cell
  def initialize(status, xpos, ypos)
    @status = status
    @position = [xpos,ypos]
  end

  def declare_state
    puts "Position is [" + @position[0].to_s + ", " + @position[1].to_s + "] and status is " + @status
  end
end

contents = Array.new(10, Array.new(10))

for i in 0..9
  for j in 0..9
    contents[i][j] = Cell.new("DEAD", i, j))
  end
end

contents.each {
  |subarray| subarray.each {
    |cell| cell.declare_status
  }
}

看起来我所有Cell对象的所有@xpos值都设置为9,这是意料之外的。

答案

在线:

contents = Array.new(10, Array.new(10))

创建一个包含10个位置的数组。您可能没有意识到的是,每个位置都填充了相同的数组。

我想你想要的

contents = Array.new(10) { Array.new(10) }
另一答案

我知道这不直接相关,但解决这个问题的一种方法是使用each_with_index而不是嵌套for循环。它看起来像这样:

class Cell
    def initialize(status, xpos, ypos)
      @status = status
      @position = [xpos,ypos]
    end
end

contents = Array.new(10, Array.new(10))

contents.each_with_index do |row, row_index|
  row.each_with_index do |cell, cell_index|
    contents[row_index][cell_index] = Cell.new("DEAD", row_index, cell_index)
  end
end
另一答案

这里有两个问题。首先是你使用insert,它在子数组中创建新元素而不是编辑值。而不是contents.at(i).insert(j, cell)你可以使用contents[i][j] = cell,其中cell是你的细胞对象。

第二个问题是你使用contents = Array.new(10, Array.new(10))创建了一个数组,其中10个元素引用了相同的单个数组引用。如果将object_id运行到每个子数组,您将看到它们都引用同一个对象。更新其中一个子阵列似乎会更新所有子阵列。

以上是关于Ruby嵌套for循环以填充数组数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 for 循环的情况下填充二维数组?

带有嵌套for循环的Javascript多维数组-无法正常工作

用于删除数组项的嵌套 For 循环

如何使用CUDA并行化嵌套for循环以在2D数组上执行计算

如何使用嵌套的 for 循环将两个 2d(倾斜)数组相加?

04Java基础语法(循环嵌套breakcontinue方法方法的重载数组动态初始化)