Назад к вопросам
Middle
108
questionbank

Зачем передавать блок при инициализации массива?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

При инициализации массива с помощью Array.new(size, &block) или Array.new(size) { ... }, блок используется для динамического определения значения каждого элемента. Без блока, если указан только размер, все элементы инициализируются значением nil. Если указать начальное значение, все элементы будут ссылаться на один и тот же объект.

Преимущества использования блока:

  • Динамическая инициализация: Каждый элемент инициализируется независимым значением, которое может зависеть от своего индекса.
  • Создание уникальных объектов: Если элементы массива должны быть уникальными объектами (например, массивами, хэшами или экземплярами классов), блок создаст новый объект для каждого элемента, вместо того чтобы все элементы ссылались на один и тот же объект.

Пример:

# Инициализация с nil
arr1 = Array.new(3)
# => [nil, nil, nil]

# Инициализация с фиксированным значением (один объект)
arr2 = Array.new(3, [])
arr2[0] << 1
# => [[1], [1], [1]] # Ожидаем [[1], [], []], но все элементы изменились

# Инициализация с блоком (уникальные объекты)
arr3 = Array.new(3) { [] }
arr3[0] << 1
# => [[1], [], []] # Ожидаемое поведение

Блок принимает аргумент — индекс текущего элемента массива, что позволяет создавать элементы с зависимостью от их положения:

arr4 = Array.new(5) { |index| index * 2 }
# => [0, 2, 4, 6, 8]

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