Назад к вопросам
Middle
110
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]
Использование блока при инициализации массива — это гибкий способ создания массива с произвольными, часто уникальными, начальными значениями для каждого элемента.