Это упоминается здесь :
При отправке второго параметра (Array.new
) один и тот же объект будет использоваться в качестве значения для всех элементов массива:
Итак, как @mudasobwa уже предлагал в комментариях, вам нужно использовать версию блока, которая использует результат блока для каждого элемента:
a, b = Array.new(2) { [0, 0] }
=> [[0, 0], [0, 0]]
a[0] = 1
a
=> [1, 0]
b
=> [0, 0]