Array.new создаёт массив. Без аргументов он пустой, с размером заполнен nil, с размером и значением содержит ссылки на переданный объект. Блок вызывается отдельно для каждого индекса и позволяет создавать независимые вложенные объекты: Array.new(3) { [] }.
Что делает Array.new в Ruby?
Создание пустого массива, заполнение nil, общее значение по умолчанию и отдельный объект для каждого элемента через блок.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Array.new создаёт новый объект массива. Способ заполнения зависит от аргументов.
p Array.new # []
p Array.new(3) # [nil, nil, nil]
p Array.new(3, 1) # [1, 1, 1]
p Array.new(3) { |i| i * i } # [0, 1, 4]
В форме Array.new(size, value) значение не копируется для каждой позиции. Это особенно важно для изменяемого объекта:
rows = Array.new(3, [])
rows[0] << 1
p rows # [[1], [1], [1]]
Здесь все три позиции ссылаются на один вложенный массив. Меняется он, поэтому изменение видно через любую из ссылок. Проблема не в том, что Ruby одновременно выполнил три вставки.
Чтобы создать независимые массивы, используйте блок:
rows = Array.new(3) { [] }
rows[0] << 1
p rows # [[1], [], []]
Блок вызывается для каждой позиции, получает индекс и возвращает значение элемента. Важно именно создавать объект внутри блока: Array.new(3) { shared_array } снова вернёт один общий массив.
Для заранее известных элементов часто проще литерал, например [1, 2, 3]. Конструктор удобен, когда размер или начальное содержимое вычисляются программно. Документация Array.new