Что делает Array.new в Ruby?

Создание пустого массива, заполнение nil, общее значение по умолчанию и отдельный объект для каждого элемента через блок.

Короткий ответ

Что ответить на собеседовании

Array.new создаёт массив. Без аргументов он пустой, с размером заполнен nil, с размером и значением содержит ссылки на переданный объект. Блок вызывается отдельно для каждого индекса и позволяет создавать независимые вложенные объекты: Array.new(3) { [] }.

Подробный разбор

Ответ с пояснениями

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

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку