生成的矩阵值未正确返回

时间:2019-04-20 14:25:05

标签: ruby matrix multidimensional-array return return-value

def test
    ret = Array.new( @height, [] )
    for y in 0..@height-1
        for x in 0..@width-1
            ret[y][x] = ( Random.rand * 10 ).to_i
        end
        print ret[y]
        puts
    end
    ret
end

当我调用测试函数时,正如预期的那样,我得到一个大小为宽×高的随机真/假矩阵。但是,当我查看返回值时,会得到一个矩阵,该矩阵的每行中都印有最后一行的内容。

当我调用该函数时,将显示以下内容:

[8, 3, 7, 9, 6, 2, 2, 2, 1, 5]
[7, 3, 2, 3, 1, 6, 0, 7, 2, 7]
[0, 0, 9, 7, 9, 5, 3, 9, 5, 3]
[7, 7, 8, 1, 6, 3, 3, 7, 9, 9]
[4, 9, 2, 7, 9, 0, 4, 2, 0, 2]
[0, 4, 0, 5, 7, 1, 5, 0, 2, 8]
[0, 5, 6, 9, 1, 8, 8, 3, 6, 2]
[6, 9, 0, 2, 0, 8, 1, 1, 0, 5]
[6, 3, 4, 9, 3, 1, 2, 7, 3, 6]
[5, 6, 6, 4, 4, 0, 0, 0, 4, 3]

我想要的是什么。

当我将函数的返回值分配给变量并查看它时,我却得到了:

[[5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3],
 [5, 6, 6, 4, 4, 0, 0, 0, 4, 3]]

这只是一遍又一遍的最后一行。

我现在的问题是:如何正确地从函数返回矩阵以在代码的其他地方使用?

我有用ret = []编写的函数,在for循环中,我使用了ret.push([]),由于某种原因,它似乎可以工作,但是看起来非常丑陋。 我还尝试了不同的数据类型,没有一个会造成差异

预期:返回值应与打印的相同

实际:返回值是重复多次的最后一行(见上文)

1 个答案:

答案 0 :(得分:0)

这是怎么回事:

Array.new( @height, [] )

这将创建一个数组,其中包含{em {em}相同数组的@height个副本。因此,在写一行时,每个循环实际上是在写矩阵中的每一行。

尝试在一个块内创建嵌套数组,这将确保每一行都有不同的行。

Array.new(@height) { Array.new(@width) }

这将为外部数组的每一行调用该块,以确保不同的行具有不同的数组。