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循环以填充数组数组的主要内容,如果未能解决你的问题,请参考以下文章