--- status: processing type: knowledge tags: - programming - ruby created: 2026-05-17 updated: 2026-05-26 source: - '[[90 Library/Programming/Ruby/Ruby - массивы]]' - '[[Итераторы для обработки массивов Ruby]]' aliases: - Ruby - массивы --- # Ruby — массивы Массив в Ruby — экземпляр класса `Array`. Поскольку массивы являются объектами со своими методами, работа со списками данных упрощается. Связанные темы: [[90 Library/Programming/Ruby/Ruby - основы языка]] ## Создание массива ```ruby a1 = [1, 2, 3] # литерал a2 = %w{word1 word2} # массив строк без кавычек a3 = ['start', nil, 5, [1, 2]] # разнотипные элементы, вложенный массив a4 = Array.new # пустой массив a5 = Array.new(3) # [nil, nil, nil] a6 = Array.new(5, "Test") # ["Test", "Test", ...] a7 = Array.new(5) { |i| i * i } # [0, 1, 4, 9, 16] a8 = Array.[](1, 'a', /^A/) # через метод класса ``` Ruby поддерживает многомерные массивы с элементами разной размерности. ## Индексация ```ruby a[0] # первый элемент a[-1] # последний элемент a[-2] # предпоследний ``` ### Размер ```ruby a.size # количество элементов a.length # синоним size ``` ## Поиск элементов ```ruby a.include?(obj) # => true / false a.index(obj) # индекс первого вхождения или nil ``` ## Добавление элементов ```ruby a << 4 # в конец a += [5] # объединение a.push(6) # в конец (синоним: append) a.unshift(0) # в начало (сдвигает остальные вправо) a.insert(2, x) # вставить перед элементом с индексом 2 ``` ## Удаление элементов ```ruby a.delete(obj) # удалить все вхождения obj a.delete_at(index) # удалить по индексу a.delete_if { |x| block } # удалить все, подходящие под условие a.shift # удалить и вернуть первый элемент a.pop # удалить и вернуть последний элемент ``` ## Срезы ```ruby a[1..3] # диапазон индексов a[1, 3] # начиная с индекса 1, длиной 3 a.values_at(0, 2, 4) # элементы по перечисленным индексам или диапазонам a.first(n) # первые n элементов a.last(n) # последние n элементов ``` ## Полезные методы ```ruby a.flatten # развернуть многомерный массив в одномерный a.flatten! # то же, но изменяет сам массив a.sample # случайный элемент a.sample(n) # n случайных элементов a.select { |x| block } # массив элементов, для которых block == true ``` ## Итераторы `each` перебирает элементы массива: ```ruby ary.each { |item| block } ``` Пример: ```ruby arr.each do |x| if x > 0 && x % 5 == 0 arr_out << x end end ``` `each_index` перебирает индексы: ```ruby ary.each_index { |index| block } ``` Похожий проход по индексам: ```ruby (0...arr.size).each do |i| if arr[i] > 0 && arr[i] % 5 == 0 arr_out << arr[i] end end ``` ### Поиск минимума, максимума и индексов Императивный вариант: ```ruby a = gets.chomp.split.map { |i| i.to_i } p a max = min = a[0] maxi = mini = 0 for i in 1...a.size if a[i] > max max = a[i] maxi = i end if a[i] < min min = a[i] mini = i end end puts "Максимальное число: #{max}, индекс: #{maxi}" puts "Минимальное число: #{min}, индекс: #{mini}" ``` Через методы массива: ```ruby a = gets.chomp.split.map { |i| i.to_i } p a max = a.max min = a.min maxi = a.index(max) mini = a.index(min) ```