173 lines
4.4 KiB
Markdown
173 lines
4.4 KiB
Markdown
---
|
|
status: processing
|
|
type: knowledge
|
|
tags:
|
|
- programming
|
|
- ruby
|
|
created: 2026-05-17
|
|
updated: 2026-05-26
|
|
title: Ruby - массивы
|
|
source:
|
|
- "[[90 Library/Programming/Ruby/Ruby - массивы]]"
|
|
- "[[Итераторы для обработки массивов 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)
|
|
```
|