Создание, проверка и управление данными в ваших приложениях является фундаментальной практикой для любого разработчика. Если вы знакомы с 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 метод, который вы можете использовать.
Это магия Руби! В самом языке есть множество инструментов, которые мы можем использовать в свою пользу, встроенные методы, помогающие нам в самых разных ситуациях, поэтому нам не нужно переписывать уже существующий код, который улучшался годами.
Подводя итог темам, упомянутым в этом посте, мы прошли через:
- Создание массивов;
- Доступ к элементам в массивах;
- методы массива;
- Добавление элементов в массив деструктивно;
- Доступ к определенному диапазону элементов в массиве.