Это распространенное недоразумение. В первом примере вы создаете массив из 2 элементов. Оба указателя являются одинаковыми массивом . Итак, когда вы выполняете итерацию по внешнему массиву, вы добавляете 2 элемента во внутренний массив, что затем отражается в ваших выходных данных дважды
Сравните это:
> array = Array.new(5, [])
=> [[], [], [], [], []]
# Note - 5 identical object IDs (memory locations)
> array.map { |o| o.object_id }
=> [70228709214620, 70228709214620, 70228709214620, 70228709214620, 70228709214620]
> array = Array.new(5) { [] }
=> [[], [], [], [], []]
# Note - 5 different object IDs (memory locations)
> array.map { |o| o.object_id }
=> [70228709185900, 70228709185880, 70228709185860, 70228709185840, 70228709185780]