Как работать с массивами в Ruby

Вступление

Array - это структура данных, которая представляет список значений, называемый elements. Массивы позволяют хранить несколько значений в одной переменной. Это может сжать и упорядочить ваш код, делая его более читабельным и обслуживаемым. А поскольку массивы являются объектами со своими собственными методами, они могут значительно упростить работу со списками данных.

В рубине. Массивы могут содержать любой тип данных, включая числа, строки и другие объекты Ruby.

Давайте рассмотрим простой пример того, насколько мощными могут быть массивы. Представьте, что вам нужно было вести список адресов электронной почты. Без массива вы можете хранить адреса электронной почты в переменных, например так:

emails.rb

email1 = "[email protected]"
email2 = "[email protected]"
email3 = "[email protected]"
email4 = "[email protected]"

Этот подход является многословным и может быстро стать сложным в поддержании, поскольку он не очень гибкий. Добавление другого адреса электронной почты означает, что вам придется добавить и отслеживать дополнительную переменную.

Если вы используете массив, вы можете упростить эти данные:

emails.js

Вместо того, чтобы создавать пять отдельных переменных, теперь у вас есть одна переменная, которая содержит все четыре адреса электронной почты. В этом примере мы использовали квадратные скобки - + [] + - для создания массива и разделяли каждую запись запятой. Если бы вам пришлось добавить дополнительный адрес электронной почты, вы бы добавили другой адрес электронной почты в массив, а не создавали и управляли новой переменной.

Чтобы получить доступ к определенному элементу или element массива, вы ссылаетесь на его index или его положение в массиве. В Ruby индексы начинаются с нуля. поэтому, чтобы извлечь первый элемент из нашего массива + emails +, мы добавляем индекс элемента к переменной, используя квадратные скобки, например:

print emails[0];

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

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

Чтобы создать массив в программе Ruby, используйте квадратные скобки: (+ [] +) и разделяйте значения, которые вы хотите сохранить, запятыми.

Например, создайте массив акул и назначьте его переменной, например так:

sharks.rb

sharks = ["Hammerhead", "Great White", "Tiger"]

Вы можете распечатать весь массив с помощью оператора + print, который отобразит содержимое массива:

print sharks
Output["Hammerhead", "Great White", "Tiger"]

Если вы хотите создать массив, в котором каждая запись представляет собой одно слово, вы можете использовать синтаксис +% w {} +, который создает массив word:

days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}

Это эквивалентно созданию массива с квадратными скобками:

days =  ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

Однако обратите внимание, что метод +% w {} + позволяет пропускать кавычки и запятые.

Массивы часто используются для группировки списков схожих типов данных, но в Ruby массивы могут содержать любое значение или набор значений, включая другие массивы. Вот пример массива, который содержит строку, значение + nil +, целое число и массив строк:

mixed_data.rb

record = [
   "Sammy",
   null,
   7,
   [
       "another",
       "array",
   ]
]

Теперь давайте посмотрим, как мы получаем доступ к данным, хранящимся в массивах.

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

Вы получаете доступ к элементу в массиве Ruby, ссылаясь на index элемента в квадратных скобках.

Давайте рассмотрим эту концепцию с нашим массивом акул, назначенным переменной + sharks +:

sharks.rb

sharks = ["Hammerhead", "Great White", "Tiger"]

Массив + sharks + состоит из трех элементов. Вот разбивка того, как каждый элемент в массиве + sharks + индексируется.

Hammerhead Greate White Tiger

0

1

2

Первым элементом в массиве является + Hammerhead +, который индексируется как + 0 +. Последний элемент - + Tiger +, который индексируется как + 2 +. Подсчет начинается с + 0 + в индексах, что противоречит нашей естественной интуиции, чтобы начать отсчет с 1, поэтому вы должны помнить об этом, пока он не станет естественным.

Вы можете узнать, сколько элементов в массиве, с помощью метода + length.

sharks.length
Output3

Хотя индексы + sharks начинаются с` + 0 + и переходят к + 2 + , свойство + length` возвращает количество элементов в массиве, которое равно + 3 +. Это вообще не касается индексов.

Если вы хотите узнать порядковый номер определенного элемента в массиве, например + seahorse +, используйте метод + index () +:

print sharks.index("Tiger")
Output2

Это возвращает индекс первого элемента, содержащего этот текст. Если индексный номер не найден, например, для несуществующего значения, консоль вернет + nil +.

print sharks.index("Whale")
Outputnil

Чтобы получить последний элемент массива в Ruby, используйте индекс + -1 +:

print sharks[-1]
Output"Tiger"

Ruby также предоставляет методы + first + и + last + для получения первого и последнего элементов без использования индексов:

puts sharks.first
puts sharks.last
Output"Hammerhead"
"Tiger"

Попытка получить доступ к индексу, который не существует, вернет + nil +.

sharks[10]
Outputnil

Массивы могут содержать другие массивы, которые мы называем nested arrays. Это один из способов моделирования двухмерных наборов данных в программе. Вот пример вложенного массива:

nested_array = [
   [
       "salmon",
       "halibut",
   ],
   [
       "coral",
       "reef",
   ]
]

Чтобы получить доступ к элементам во вложенном массиве, вы должны добавить еще один индекс, соответствующий внутреннему массиву. Например, чтобы извлечь значение + coral + из этого вложенного массива, вы должны использовать следующий оператор:

print nested_array[1][0];
Outputcoral

В этом примере мы получили доступ к массиву в позиции + 1 + переменной + nested_array +, которая вернула массив + [" коралл "," риф "] +. Затем мы получили доступ к элементам в позиции + 0 + этого массива, который был " коралл ".

Теперь давайте посмотрим, как добавить элементы в массив.

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

У нас есть три элемента в нашем массиве + sharks +, которые проиндексированы от + 0 + до + 2 +:

sharks.rb

sharks = ["Hammerhead", "Great White", "Tiger"]

Есть несколько способов добавить новый элемент. Вы можете присвоить значение следующему индексу, который в этом случае будет + 3 +:

sharks[3] = "whale";

print sharks
Output["Hammerhead", "Great White", "Tiger", "Whale"]

Этот метод подвержен ошибкам, хотя. Если вы добавите элемент и случайно пропустите индекс, он создаст элемент + nil + в массиве.

sharks[5] = "Sand";

print sharks;
Output["Hammerhead", "Great White", "Tiger", "Whale", , "Sand"]

Попытка получить доступ к дополнительному элементу массива вернет его значение, которое будет + nil +.

sharks[4]
Outputnil

Поиск следующего доступного индекса в массиве подвержен ошибкам и занимает дополнительное время. Избегайте ошибок, используя метод + push +, который добавляет элемент в конец массива:

sharks.push("thresher")
print sharks
Output["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", ]

Вы также можете использовать синтаксис + << + вместо метода + push +, чтобы добавить элемент в конец массива:

sharks << "Bullhead"
Output["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", ]

Чтобы добавить элемент в начало массива, используйте метод + unshift () +:

sharks.unshift("Angel")
print sharks
Output[, "Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

Теперь, когда вы знаете, как добавлять элементы, давайте рассмотрим их удаление.

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

Чтобы удалить определенный элемент из массива, используйте методы + delete + или + delete_at +. В массиве + sharks + мы случайно создали элемент массива + nil + ранее. Давайте избавимся от этого.

Сначала найдите его позицию в массиве. Вы можете использовать метод + index для этого:

print sharks.index(nil)
Output4

Затем используйте + delete_at +, чтобы удалить элемент с индексом + 4 + и выведите массив:

sharks.delete_at(4)
print sharks
Output["Angel", "Hammerhead", "Great White", "Tiger", "Whale", "Thresher", "Bullhead"]

Метод + delete + удаляет элементы из массива, которые соответствуют значению, которое вы передаете. Используйте его для удаления + Whale + из массива:

sharks.delete("Whale")
print sharks;
Output["Angel", "Hammerhead", "Great White", "Tiger", "Thresher", "Bullhead"]

Метод + delete удалит вхождения all значения, которое вы передаете, поэтому, если в вашем массиве есть повторяющиеся элементы, все они будут удалены.

Метод + pop + удалит последний элемент в массиве.

sharks.pop
print sharks;
Output["Angel", "Hammerhead", "Great White", "Tiger", "Thresher"]

+ Bullhead + был удален как последний элемент массива. Чтобы удалить первый элемент массива, используйте метод + shift +.

sharks.shift
print sharks
Output["Hammerhead", "Great White", "Tiger", "Thresher"]

На этот раз + Angel + был удален из начала массива.

Используя + pop + и + shift +, вы можете удалять элементы из начала и конца массивов. Использование + pop + является предпочтительным везде, где это возможно, так как остальные элементы в массиве сохраняют свои исходные порядковые номера.

Методы + delete_at,` + pop` и + shift изменяют исходный массив и возвращают удаленный элемент. Попробуйте этот пример:

sharks.rb

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
deleted_at_element = sharks.delete_at(1)
popped_element = sharks.pop

puts "Deleted_at element: #{deleted_at_element}"
puts "Popped element: #{popped_element}"

puts "Remaining array: #{sharks}"
OuptutDeleted_at element: Great White
Popped element: Whale
Remaining array: ["Hammerhead", "Tiger"]

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

Модификация существующих элементов

Чтобы обновить элемент в массиве, присвойте новое значение индексу элемента с помощью оператора присваивания, как если бы вы использовали обычную переменную.

Учитывая новый массив акул, с " Hammerhead " в индексе + 0 +, давайте заменим " Hammerhead " на " Angel ":

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
Output["Angel", "Great White", "Tiger", "Whale"]

Чтобы убедиться, что вы обновляете нужный элемент, вы должны сначала использовать метод + index, чтобы найти элемент, как вы это делали, чтобы найти элемент, который вы хотите удалить.

Теперь давайте посмотрим, как работать со всеми элементами в массиве.

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

Ruby предоставляет много способов перебора массива, и каждый используемый вами метод зависит от вида работы, которую вы хотите выполнить. В этой статье мы рассмотрим, как перебирать массив и отображать каждый из его элементов.

Ruby предоставляет синтаксис + for..in +, который выглядит следующим образом:

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
for shark in sharks do
 puts shark
end

Вот как это работает. Для каждого элемента в массиве + sharks + Ruby присваивает этот элемент локальной переменной + shark +. Затем мы можем напечатать значение элемента, используя + put +.

Вы не увидите + for..in + очень часто. Массивы Ruby являются объектами, и они предоставляют метод + each + для работы с элементами. Метод + each + работает аналогично + for..in +, но имеет другой синтаксис:

each.rb

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
 puts shark
end

Метод + each + использует синтаксис, который вы часто будете видеть в программировании на Ruby. Он принимает блок Ruby в качестве аргумента. Block - это некоторый код, который будет выполнен позже в контексте метода. В этом случае код + ставит акулу +. Ключевое слово + shark +, заключенное в символы канала (+ | +), является локальной переменной, представляющей элемент в массиве, к которому будет обращаться блок. Ruby назначает элемент этой переменной и выполняет код в блоке. Метод + each + повторяет этот процесс для каждого элемента в массиве. Результат выглядит так:

OutputHammerhead
Great White
Tiger
Whale

Когда блок состоит только из одной строки, вы часто видите, как разработчики Ruby заменяют ключевые слова + do + и + end + фигурными скобками и уплотняют весь оператор в одну строку, например:

each.rb

...
sharks.each {|shark| puts shark }

Это дает те же результаты, но использует меньше строк кода.

Метод + each_with_index + работает аналогичным образом, но он также дает вам доступ к индексу элемента массива. Эта программа использует + each_with_index +, чтобы распечатать индекс и значение для каждого элемента:

each_with_index.rb

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each_with_index do |shark, index|
 puts "The index is #{index}"
 puts "The value is #{shark}"
end

Для каждого элемента в массиве Ruby присваивает элемент переменной + shark + и присваивает текущий индекс переменной + index +. Затем мы можем ссылаться на обе эти переменные в блоке.

Результат этой программы выглядит так:

OutputThe index is 0
The value is Hammerhead
The index is 1
The value is Great White
The index is 2
The value is Tiger
The index is 3
The value is Whale

Вы будете взаимодействовать с элементами массива часто в своих собственных программах, например, когда вам нужно отобразить элементы из базы данных на веб-сайте или когда вы читаете строки из файла и обрабатываете их содержимое.

Заключение

Массивы являются чрезвычайно универсальной и фундаментальной частью программирования на Ruby. В этом уроке вы создали массивы и получили доступ к отдельным элементам. Вы также добавили, удалили и изменили элементы в массиве. Наконец, вы исследовали два способа перебора массива и отображения его содержимого, которое используется в качестве распространенного метода отображения данных.

Узнайте о других типах данных в Ruby, прочитав учебное руководство Understanding Типы данных в Ruby.