Как работать с массивами?ruby-22

Создание массивов

Базовые способы создания

arr1 = []                  # Пустой массив
arr2 = Array.new           # Аналогично []
arr3 = [1, 2, 3]           # Массив с элементами
arr4 = %w[one two three]   # Массив строк ["one", "two", "three"]
arr5 = Array.new(3)        # [nil, nil, nil]
arr6 = Array.new(3, 'x')   # ["x", "x", "x"] (осторожно с mutable объектами!)
arr7 = (1..5).to_a         # Диапазон в массив [1, 2, 3, 4, 5]

Основные операции

Доступ к элементам

arr = [10, 20, 30, 40, 50]
arr[0]    # => 10 (первый элемент)
arr[-1]   # => 50 (последний элемент)
arr[1..3] # => [20, 30, 40] (срез)
arr.fetch(2) # => 30 (с проверкой границ)

Добавление элементов

arr = [1, 2]
arr.push(3)     # => [1, 2, 3]
arr << 4        # => [1, 2, 3, 4] (синтаксический сахар для push)
arr.unshift(0)  # => [0, 1, 2, 3, 4] (добавление в начало)
arr.insert(2, 1.5) # => [0, 1, 1.5, 2, 3, 4] (вставка по индексу)

Удаление элементов

arr = [1, 2, 3, 4, 5]
arr.pop      # => 5, arr становится [1, 2, 3, 4]
arr.shift    # => 1, arr становится [2, 3, 4]
arr.delete(3) # => 3, arr становится [2, 4]
arr.delete_at(1) # => 4, arr становится [2]

Итерация по массиву

Основные методы перебора

[1, 2, 3].each { |x| puts x }  # Выводит 1, 2, 3
[1, 2, 3].map { |x| x * 2 }    # => [2, 4, 6]
[1, 2, 3].select { |x| x.odd? } # => [1, 3]
[1, 2, 3].reject { |x| x.even? } # => [1, 3]

Итерация с индексом

['a', 'b', 'c'].each_with_index do |item, index|
  puts "#{index}: #{item}"
end
# Вывод:
# 0: a
# 1: b
# 2: c

Поиск в массивах

arr = [1, 2, 3, 4, 5]
arr.include?(3)   # => true
arr.index(4)      # => 3 (индекс элемента)
arr.find { |x| x > 3 } # => 4 (первый соответствующий)
arr.grep(2..4)    # => [2, 3, 4] (по диапазону)

Сортировка и модификация

Сортировка

[3, 1, 2].sort           # => [1, 2, 3]
['b', 'a', 'c'].sort_by(&:upcase) # => ['a', 'b', 'c']

Обращение и перемешивание

[1, 2, 3].reverse # => [3, 2, 1]
[1, 2, 3].shuffle # => случайный порядок

Полезные методы

Объединение и разность

[1, 2] + [3, 4]    # => [1, 2, 3, 4]
[1, 2, 2, 3] - [2] # => [1, 3]
[1, 2] | [2, 3]    # => [1, 2, 3] (объединение без дубликатов)
[1, 2] & [2, 3]    # => [2] (пересечение)

Агрегация

[1, 2, 3].sum       # => 6
[1, 2, 3].inject(:*) # => 6 (1*2*3)
[1, 2, 3].max       # => 3
[1, 2, 3].minmax    # => [1, 3]

Многомерные массивы

Работа с матрицами

matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

matrix[1][2] # => 6
matrix.transpose # => Транспонированная матрица

Преобразование

matrix.flatten # => [1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3].product([4, 5]) # => Декартово произведение

Лучшие практики

  1. Используйте each для простого перебора без модификации
  2. Применяйте map для преобразования элементов
  3. Избегайте for циклов в пользу итераторов
  4. Используйте &:method для простых операций: names.map(&:upcase)
  5. Будьте осторожны с mutable объектами в массивах

Резюмируем: массивы в Ruby - это мощные и гибкие структуры данных с богатым набором методов. Понимание их API позволяет писать лаконичный и выразительный код. Ruby предоставляет множество способов для манипуляции массивами - от базовых операций добавления/удаления элементов до сложных преобразований с использованием блоков и лямбда-выражений.