Ruby:迭代内部的 for 循环导致数组填充"range"类项



有一个二维数组,默认情况下用"0"填充。我想创建另一个数组,该数组保存每列的"non 0"项目数,因此,第二个数组的长度与二维数组的列数相同。

这是我遇到的代码,我用固定长度(2D 数组的列数)初始化了 1D 数组

column_depth=Array.new(8) {0}

遍历 2D 数组并针对每列的每个非 0 元素,我想增加 1D 数组中的相应值:

column_depth.map! do |a|
for i in 0..6
    play_field[i].each do |b|
        if b != "0"
            a = a+1
        end
    end
end
end #outer map (column_depth)

但是,当我打印出column_depth数组的内容时,我得到以下结果:

0..6
0..6
0..6
0..6
0..6
0..6
0..6
0..6

我对这个输出完全感到困惑,为什么它可以将 for 循环的范围分配给值"a"? (测试输入为play_field的全零矩阵)

map!通过将每个值替换为提供的块计算值的任何值来更新数组。重新赋值块参数不起作用。

当你写它时,块将计算为for表达式计算的任何值,这始终是迭代的东西(在本例中为范围)

您需要做的就是更改它,以便块中的最后一行计算出您想要的结果。

作为旁白,您可以将块内容替换为类似的东西

a + play_field[0..6].count {|b| b != "0} 

很少需要迭代一系列整数作为迭代集合的一种方式。

您不必创建数组然后对其进行修改。只

column_depth = play_field.map{|col| col.count{|n| n != 0}}

对于计算play_field其他维度中的非零数,

row_depth = play_field.transpose.map{|row| row.count{|n| n != 0}}

最新更新