Значение сгенерированной матрицы не возвращается должным образом - PullRequest
0 голосов
/ 20 апреля 2019
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 голосов
/ 20 апреля 2019

Что происходит здесь:

Array.new( @height, [] )

Это создает массив, содержащий @height копии того же массива . Таким образом, каждый цикл, когда вы пишете в строку, вы фактически пишете в каждую строку в вашей матрице.

Попробуйте создать свой вложенный массив внутри блока, чтобы убедиться, что у каждой строки есть свой отдельный.

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

Это вызовет блок для каждой строки внешнего массива, гарантируя, что разные строки имеют разные массивы.

...