Создание, проверка и управление данными в ваших приложениях является фундаментальной практикой для любого разработчика. Если вы знакомы с JavaScript, есть несколько способов представления данных, таких как объекты и массивы.

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

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

# Creating an array typing a pair of square brackets
[]

# Creating an array through the .new method
Array.new
 => []

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

[].class
 => Array 

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

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

numbers_array = [1, 2, 3, 4]

numbers_array[0]
 => 1

numbers_array[1]
 => 2

Мы можем получить доступ к элементам массива с помощью скобок, что позволяет нам передать правильный индекс элемента, который мы хотим получить. Поскольку индекс массива начинается с 0, для доступа к первому элементу массива — в данном случае к числу «1» — мы должны присвоить ему индекс 0.

А теперь представьте, если бы у нас был большой массив с таким количеством элементов, и мы хотели бы получить доступ к последнему из них? Мы можем сделать это:

animals_array = ['elephant', 'cat', 'lion', 'penguin', 'tiger', 'bird', 'snake', 'monkey', 'crocodile', 'gorilla', 'hippopotamus', 'fish', 'zebra', 'giraffe']

animals_array[animals_array.length - 1]
 => "giraffe"

Но мы все еще можем сделать это проще:

animals_array[-1]
 => "giraffe"

Передача -1 в скобках даст нам доступ к последнему элементу массива.

Другая распространенная ситуация — если мы хотим обновить элемент массива, не записывая новый. Обновим третий элемент массива:

desserts_array = ["Cookies", "Ice cream", "Chocolate cake"]

desserts_array[2] = "Apple pie"

desserts_array
 => ["Cookies", "Ice cream", "Apple pie"]

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

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

[].methods
 => [:to_h, :include?, :&, :*, :+, :-, :at, :fetch, :last, :union, :difference, :intersection, :push, :append, :pop, :shift, :unshift, :each_index, :join, :rotate, :rotate!, :sort!, :sort_by!, :collect!, :map!, :select!, :filter!, :keep_if, :values_at, :delete_at, :delete_if, :reject!, :transpose, :fill, :assoc, :rassoc, :uniq!, :compact, :compact!, :flatten, :flatten!, :shuffle!, :shuffle, :sample, :permutation, :combination, :repeated_permutation, :repeated_combination, :product, :bsearch, :sort, :bsearch_index, :deconstruct, :count, :find_index, :select, :filter, :reject, :collect, :map, :first, :all?, :any?, :one?, :none?, :minmax, :|, :reverse_each, :zip, :take, :take_while, :drop, :<=>, :<<, :cycle, :drop_while, :==, :sum, :uniq, :[], :[]=, :insert, :empty?, :eql?, :index, :rindex, :replace, :clear, :max, :min, :inspect, :length, :size, :each, :reverse, :concat, :prepend, :reverse!, :to_ary, :to_a, :to_s, :pack, :delete, :slice, :slice!, :dig, :hash, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :slice_after, :slice_when, :chunk_while, :to_set, :chain, :lazy, :find, :entries, :sort_by, :grep, :grep_v, :detect, :find_all, :filter_map, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :tally, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :dup, :itself, :yield_self, :then, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :class, :display, :singleton_class, :clone, :public_send, :method, :public_method, :singleton_method, :define_singleton_method, :extend, :to_enum, :enum_for, :===, :=~, :!~, :nil?, :respond_to?, :freeze, :object_id, :send, :__send__, :!, :!=, :__id__, :equal?, :instance_eval, :instance_exec] 

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

Общие методы массива

В качестве примеров рассмотрим массив десертов. Если вы используете какие-либо деструктивные методы, снова обратитесь к десертному_массиву.

desserts_array = ["Cookies", "Ice cream", "Chocolate cake", "Apple pie"]

# Returns last element
desserts_array.last
 => "Apple pie"

# Returns first element
desserts_array.first
 => "Cookies" 

# Returns the first n elements, passing the n argument inside the parenthesis
desserts_array.take(2)
 => ["Cookies", "Ice cream"]

# Removes last element of an array destructively, returning the removed element
desserts_array.pop
 => "Apple pie" 

desserts_array
 => ["Cookies", "Ice cream", "Chocolate cake"]

# Removes first element of an array destructively, returning the removed element
desserts_array.shift
 => "Cookies"

desserts_array
 => ["Ice cream", "Chocolate cake", "Chocolate cake"] 

# Check if an element is present
desserts_array.include?("Cookies")
 => true 

# Reverse elements in an array non destructively
desserts_array.reverse
 => ["Apple pie", "Chocolate cake", "Ice cream", "Cookies"]

desserts_array
 => ["Cookies", "Ice cream", "Chocolate cake", "Apple pie"]

Хотя приведенные выше примеры не включают в себя все существующие методы работы с массивами Ruby, у нас уже может быть хороший набор инструментов для работы с массивами в приложениях Ruby.

Деструктивное добавление элементов массива

Давайте рассмотрим еще несколько примеров, которые позволят нам добавлять элементы в массив:

desserts_array = ["Cookies", "Ice cream", "Chocolate cake"]


# Adding element to the end of an array destructively
desserts_array.push("Fruits")
 => ["Cookies", "Ice cream", "Chocolate cake", "Fruits"]

desserts_array
 => ["Cookies", "Ice cream", "Chocolate cake", "Fruits"]

# Adding element to beggining of an array destructively
desserts_array.unshift("Brownie")
 => ["Brownie", "Cookies", "Ice cream", "Chocolate cake"]

desserts_array
 => ["Brownie", "Cookies", "Ice cream", "Chocolate cake"]

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

Мы также можем проверять значения элементов в пределах определенного индекса диапазон. Предположим, мы хотим получить с 3-го по 5-й элементы массива:

numbers_array = [1, 2, 3, 4, 5, 6]

numbers_array[2..4]
 => [3, 4, 5]

Как мы видели ранее в этом посте, массивы начинаются с индекса 0, который представляет первый элемент массива. Итак, чтобы мы могли получить доступ к элементам с 3-го по 5-й, нам нужно передать в обозначение скобок — используемое для доступа к элементу внутри массива — индексы 2 и 4.

Обратите внимание, что на этот раз мы сделали что-то немного другое при доступе к нашим элементам. Мы использовали ‘..’, чтобы сообщить Ruby, чтобы он предоставил нам элементы в диапазоне индексов 2 и 4, включая элементы индексов 2 и 4. Другой способ доступа к диапазонам — оператор «…»:

numbers_array = [1, 2, 3, 4, 5, 6]

numbers_array[2...4]
 => [3, 4]

Разница между «..» и «…» заключается в том, что последний возвращает элементы в пределах диапазона, но не включает последний элемент.

В завершение этого поста я хотел бы упомянуть еще об одном методе массивов Ruby, который называется «лопата». Он представлен символом «‹‹», который вставляет элементы в массив. Лопата делает то же самое, что и толчок:

numbers_array = [1, 2, 3, 4, 5, 6]

numbers_array << 7
 => [1, 2, 3, 4, 5, 6, 7]

numbers_array
 => [1, 2, 3, 4, 5, 6, 7] 

Заключение

Методы массива широко используются в Ruby, поэтому общее понимание того, как и когда использовать метод, может очень помочь нам, разработчикам, при создании приложений. Это не значит, что вам нужно запоминать каждый метод и то, что он делает. Перед созданием любого типа кода для итерации с массивами обязательно сначала проверьте, есть ли какой-либо встроенный в Ruby метод, который вы можете использовать.

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

Подводя итог темам, упомянутым в этом посте, мы прошли через:

  • Создание массивов;
  • Доступ к элементам в массивах;
  • методы массива;
  • Добавление элементов в массив деструктивно;
  • Доступ к определенному диапазону элементов в массиве.