Ruby Arrays

Массивы представляют собой последовательность значений, позволяющую иметь к этим значениям доступ по их позициям, по индексам, выстроенным в последовательность. В Ruby первое значение массива имеет индекс, равный нулю. Методы size и length возвращают количество элементов массива. У последнего элемента массива индекс равен size-1. Отрицательные значения индексов отсчитываются с конца массива, поэтому к последнему элементу массива можно получить доступ по индексу -1. Второй с конца элемент имеет индекс -2 и т. д. При попытке считать значение элемента за концом массива (когда указанный индекс >= size) или перед его началом (когда указанный индекс < -size) Ruby просто возвращает nil и не выдает никакого исключения. Массивы в Ruby не типизированы и изменяемы. Элементы массива не обязаны быть одного и того же класса и в любое время могут подвергаться изменениям. Более того, размеры массивов могут динамически изменяться; к ним можно добавлять элементы, и они по необходимости будут расти в размерах. Если присвоить значение элементу за концом массива, массив автоматически расширится на элементы со значением nil. (Но присвоение значения элементу перед началом массива является ошибкой.)

Flenagan-Matsumoto.pdf ст.90

Массивы Ruby - это упорядоченные коллекции любого объекта с целочисленным индексом. Каждый элемент в массиве связан с индексом и упоминается по нему. Индексация массива начинается с 0, как в C или Java. Отрицательный индекс предполагается относительно конца массива, то есть индекс -1 указывает последний элемент массива, -2 - предпоследний элемент в массиве и так далее. Массивы Ruby могут содержать такие объекты, как String, Integer, Fixnum, Hash, Symbol и даже другие объекты Array. Массивы Ruby не такие жесткие, как массивы в других языках. Массивы Ruby автоматически увеличиваются при добавлении к ним элементов.

Creating Arrays (Создание массивов):

Есть много способов создать или инициализировать массив. Один из способов - использовать new метод класса:

names = Array.new

Вы можете установить размер массива во время создания массива:

names = Array.new (20)

Имена массивов теперь имеют размер или длину 20 элементов. Вы можете вернуть размер массива с помощью методов size или length:

month.size # Возвращает 20

months.length # Также возвращает 20

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

#!/usr/bin/ruby

​​names = Array.new (4, "mac")

puts "#{names}"

Это даст следующий результат:

macmacmacmac

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

#!/usr/bin/ruby

​​nums = Array.new (10) { |e| e = e * 2 }

puts "#{nums}"

Это даст следующий результат:

024681012141618

Есть еще один метод Array, [ ]. Это работает так:

nums = Array. [] (1, 2, 3, 4,5)

Еще одна форма создания массива:

nums = Array [1, 2, 3, 4,5]

Модуль ядра, доступный в ядре Ruby, имеет метод Array, который принимает только один аргумент. Здесь метод принимает диапазон в качестве аргумента для создания массива цифр:

#!/usr/bin/ruby

​​digits = Array (0..9)

puts "#{digits}"

Это даст следующий результат:

0123456789

Attay Build-in Methods (Встроенные методы массива):

Нам нужен экземпляр объекта Array для вызова метода Array. Как мы видели, следующий способ создания экземпляра объекта Array:

Array. [] (...) [or] Array [...] [or] [...]

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

#!/usr/bin/ruby

​​digits = Array (0..9)

num = digits.at (6)

puts "#{num}"

Это даст следующий результат:

6

Ниже приведены общедоступные методы массива (при условии, что массив является объектом массива):


SN Методы с описанием

1 array & other_arrayВозвращает новый массив, содержащий элементы, общие для двух массивов, без дубликатов.2 array * int [or] массив * strВозвращает новый массив, построенный путем объединения копий int типа self. С аргументом String, эквивалентным self.join (str).3 array + other_arrayВозвращает новый массив, построенный путем объединения двух массивов вместе для создания третьего массива.4 array. other_arrayВозвращает новый массив, который является копией исходного массива, удаляя все элементы, которые также появляются в other_array.5 str <=> other_strСравнивает str с other_str, возвращая -1 (меньше), 0 (равно) или 1 (больше). При сравнении учитывается регистр.6 array | other_arrayВозвращает новый массив, объединяя массив с other_array, удаляя дубликаты.7 array << objПомещает данный объект в конец массива. Это выражение возвращает сам массив, поэтому несколько добавлений могут быть связаны вместе.8 array <=> other_arrayВозвращает целое число (-1, 0 или +1), если этот массив меньше, равен или больше other_array.9 array == other_arrayДва массива равны, если они содержат одинаковое количество элементов и если каждый элемент равен (согласно Object. ==) соответствующему элементу в другом массиве.10 array [index] [or] array [start, length] [or] array [range] [or] array.slice (index) [or] array.slice (start, length) [or] array.slice (range)Возвращает элемент по индексу или возвращает подмассив, начинающийся с начала и продолжающийся для элементов длины, или возвращает подмассив, указанный диапазоном. Отрицательные индексы отсчитываются в обратном порядке от конца массива (-1 - последний элемент). Возвращает ноль, если индекс (или начальный индекс) выходит за пределы допустимого диапазона.11 array [index] = obj [or]array [start, length] = obj or an_array or nil [or]array [range] = obj or an_array or nilУстанавливает элемент по индексу или заменяет подмассив, начинающийся с начала и продолжающийся для элементов длины, или заменяет подмассив, указанный диапазоном. Если индексы превышают текущую емкость массива, массив автоматически увеличивается. Отрицательные индексы будут отсчитываться в обратном порядке от конца массива. Вставляет элементы, если длина равна нулю. Если nil используется во второй и третьей форме, удаляет элементы из self.12 array.abbrev (pattern = nil)Вычисляет набор однозначных сокращений для строк в self. Если передан шаблон или строка, учитываются только строки, соответствующие шаблону или начинающиеся со строки.13 array.assoc (obj)Выполняет поиск в массиве, элементы которого также являются массивами, сравнивая obj с первым элементом каждого содержащегося массива, используя obj. ==. Возвращает первый совпадающий содержащийся массив или ноль, если совпадение не найдено.14 array.at (index)Возвращает элемент по индексу. Отрицательный индекс отсчитывается от конца self. Возвращает ноль, если индекс вне допустимого диапазона.15 array.clearУдаляет все элементы из массива.16 array.collect {|item| block} [or] array.map {|item| block}Вызывает блок один раз для каждого элемента self. Создает новый массив, содержащий значения, возвращаемые блоком.17 array.collect! { |item| block} [or] array.map! { |item| block} Вызывает блок один раз для каждого элемента self, заменяя элемент значением, возвращаемым блоком.18 array.compactВозвращает копию self со всеми удаленными элементами nil.19 array.compact!Удаляет нулевые элементы из массива. Возвращает ноль, если никаких изменений не было.20 array.concat (other_array)Добавляет элементы в other_array к self.21 array.delete(obj) [or] array.delete(obj) {block}Удаляет из себя элементы, которые равны obj. Если элемент не найден, возвращается ноль. Если указан дополнительный блок кода, возвращает результат блока, если элемент не найден.22 array.delete_at(index)Удаляет элемент по указанному индексу, возвращая этот элемент, или nil, если индекс выходит за пределы допустимого диапазона.23 array.delete_if { |item| block}Удаляет каждый элемент self, для которого блок имеет значение true.24 array.each { |item| block}Вызывает блок один раз для каждого элемента в self, передавая этот элемент в качестве параметра.25 array.each_index { |index| block}То же, что и Array # each, но передает индекс элемента вместо самого элемента.26 array.empty?Возвращает true, если массив self не содержит элементов.27 array.eql?(other)Возвращает истину, если array и other являются одним и тем же объектом или оба массива с одинаковым содержимым.28 array.fetch(index) [or] array.fetch(index, default) [or] array.fetch(index) { |index| block}Пытается вернуть элемент в позиции index. Если индекс находится вне массива, первая форма выдает исключение IndexError, вторая форма возвращает значение по умолчанию, а третья форма возвращает значение вызывающего блока, передавая индекс. Отрицательные значения индекса отсчитывают от конца массива.29 array.fill(obj) [or] array.fill(obj, start [, length]) [or] array.fill(obj, range) [or] array.fill { |index| block} [or] array.fill(start [, length]) { |индекс| block} [or] array.fill(range) {|index| block }Первые три формы устанавливают для выбранных элементов self значение obj. Начало с нуля эквивалентно нулю. Длина nil эквивалентна self.length. Последние три формы заполняют массив значением блока. Блоку передается абсолютный индекс каждого заполняемого элемента.30 array.first [or] array.first(n)Возвращает первый элемент или первые n элементов массива. Если массив пуст, первая форма возвращает ноль, а вторая форма возвращает пустой массив.31 array.flatten (Плоский)Возвращает новый массив, который является одномерным сглаживанием этого массива (рекурсивно).32 array.flatten!Сглаживает массив на месте. Возвращает ноль, если никаких изменений не было. (массив не содержит подмассивов.)33 array.frozen?Возвращает истину, если массив заморожен (или временно заморожен во время сортировки).34 array.hashВычислить хеш-код для массива. Два массива с одинаковым содержимым будут иметь одинаковый хэш-код.35 array.include?(obj)Возвращает true, если obj присутствует в self, иначе false.36 array.index(obj)Возвращает индекс первого объекта в self, который == для obj. Возвращает ноль, если совпадений не найдено.37 array.indexes(i1, i2, ... iN) [or] array.indices(i1, i2, ... iN)Эти методы устарели в последней версии Ruby, поэтому используйте Array # values_at.38 array.indices (i1, i2, ... iN) [or] array.indexes (i1, i2, ... iN)Эти методы устарели в последней версии Ruby, поэтому используйте Array # values_at.39 array.insert (index, obj ...)Вставляет заданные значения перед элементом с заданным индексом (который может быть отрицательным).40 array.inspectСоздает версию массива для печати.41 array.join(sep=$,)Возвращает строку, созданную преобразованием каждого элемента массива в строку, разделенную sep.42 array.last [or] array.last (n)Возвращает последний элемент (ы) self. Если массив пуст, первая форма возвращает ноль.43 array.lengthВозвращает количество элементов в себе. Может быть нулевым.44 array.map { |item| block} [or] array.collect { |item| block}Вызывает блок один раз для каждого элемента self. Создает новый массив, содержащий значения, возвращаемые блоком.45 array.map! { |item| block} [or] array.collect! { |item| block}Вызывает блок один раз для каждого элемента массива, заменяя элемент значением, возвращаемым блоком.46 array.nitemsВозвращает количество ненулевых элементов в self. Может быть нулевым.47 array.pack (aTemplateString)Упаковывает содержимое массива в двоичную последовательность в соответствии с директивами в aTemplateString. За директивами A, a и Z может следовать счетчик, который дает ширину результирующего поля. Остальные директивы также могут иметь счетчик, указывающий количество элементов массива для преобразования. Если счетчик отмечен звездочкой (*), все оставшиеся элементы массива будут преобразованы. Любая из директив sSiIlL может сопровождаться знаком подчеркивания (_), чтобы использовать собственный размер базовой платформы для указанного типа; в противном случае они используют размер, не зависящий от платформы. Пробелы в строке шаблона игнорируются. (См. Таблицу шаблонов ниже)48 array.popУдаляет последний элемент из массива и возвращает его или nil, если массив пуст.49 array.push (obj, ...)Помещает (добавляет) заданный объект в конец этого массива. Это выражение возвращает сам массив, поэтому несколько добавлений могут быть связаны вместе.50 array.rassoc(key)Выполняет поиск в массиве, элементы которого также являются массивами. Сравнивает ключ со вторым элементом каждого содержащегося массива, используя ==. Возвращает первый совпадающий содержащийся массив.51 array.reject { |item| block}Возвращает новый массив, содержащий массив элементов, для которых блок не соответствует действительности.52 array.reject! { |item| block}Удаляет элементы из массива, для которых блок имеет значение true, но возвращает ноль, если не было сделано никаких изменений. Эквивалентно массиву # delete_if.53 array.replace(other_array)Заменяет содержимое массива содержимым other_array, усекая или расширяя при необходимости.54 array.reverseВозвращает новый массив, содержащий элементы массива в обратном порядке.55 array.reverse!Переворачивает массив на место.56 array.reverse_each { |item| block}То же, что и Array # each, но пересекает массив в обратном порядке.57 array.rindex(obj)Возвращает индекс последнего объекта в массиве == в obj. Возвращает ноль, если совпадений не найдено.58 array.select {|item| block}Вызывает блок, передавая последовательные элементы из массива, возвращая массив, содержащий те элементы, для которых блок возвращает истинное значение.59 array.shiftВозвращает первый элемент self и удаляет его (сдвигая все остальные элементы на один вниз). Возвращает nil, если массив пуст.60 array.sizeВозвращает длину массива (количество элементов). Псевдоним длины.61 array.slice (index) [or] array.slice (start, length) [or] array.slice (range) [or] array [index] [or] array [start, length] [or] array [range]Возвращает элемент по индексу или возвращает подмассив, начинающийся с начала и продолжающийся для элементов длины, или возвращает подмассив, указанный диапазоном. Отрицательные индексы отсчитываются в обратном порядке от конца массива (-1 - последний элемент). Возвращает ноль, если индекс (или начальный индекс) выходит за пределы допустимого диапазона.62 array.slice! (index) [or] array.slice! (start, length) [or] array.slice! (range)Удаляет элемент (ы), заданный индексом (необязательно длиной) или диапазоном. Возвращает удаленный объект, подмассив или ноль, если индекс вне допустимого диапазона.63 array.sort [or] array.sort { |а, б| block}Возвращает новый массив, созданный путем сортировки self.64 array.sort! [or] array.sort! { |а, б| block}Сортирует себя.65 array.to_aВозвращает себя. Если вызывается в подклассе Array, преобразует получатель в объект Array.66 array.to_aryВозвращает себя.67 array.to_sВозвращает self.join.68 array.transposeПредполагает, что self является массивом массивов и меняет местами строки и столбцы.69 array.uniqВозвращает новый массив, удаляя повторяющиеся значения в массиве.70 array.uniq!Удаляет повторяющиеся элементы из себя. Возвращает nil, если не было внесено никаких изменений (то есть дубликаты не найдены).71 array.unshift (obj, ...)Добавляет объекты к началу массива, другие элементы - вверх.72 array.values_at (selector, ...)Возвращает массив, содержащий элементы self, соответствующие заданному селектору (одному или нескольким). Селекторы могут быть целочисленными индексами или диапазонами.73 array.zip (arg, ...) [or] array.zip (arg, ...) {|arr| block}Преобразует любые аргументы в массивы, затем объединяет элементы массива с соответствующими элементами из каждого аргумента.


Array pack directives (Директивы пакета массивов):


В следующей таблице перечислены директивы pack для использования с Array#pack.


Directive Description

@ Перемещает в абсолютную позицию.A Строка ASCII (заполнено пробелом, количество равно ширине).a Строка ASCII (заполнено нулем, количество равно ширине) .B Bit строка (убывающая битовая последовательность) .b Bit строка (возрастающая битовая последовательность) .C Unsigned char.c Char. D, d с плавающей запятой двойной точности, собственный формат. E с плавающей запятой двойной точности, порядок байтов с прямым порядком байтов. e с плавающей запятой одинарной точности, порядок байтов с прямым порядком байтов. F, f с плавающей точкой с одинарной точностью, собственный формат. G с плавающей запятой двойной точности, сеть (большой -endian) byte order.g Single-precision float, network (big-endian) byte order.H Hex string (старший полубайт сначала) .h Hex string (младший полубайт сначала) .I Unsigned integer.iInteger.L Unsigned long.l Long. M Quoted printable, MIME кодировка (см. RFC 2045) .m Base64-кодированная строка. N Long, сетевой (big-endian) порядок байтов. n Short, сетевой (big-endian) порядок байтов. P Указатель на структуру (строка фиксированной длины). p Указатель на нулевое значение. завершенная строка.Q, q 64-битное число. Беззнаковое короткое. s Short.UUTF-8.uUU-кодированная строка. V Длинный, прямой порядок байтов. v Short, порядок байтов с прямым порядком байтов .w BER-сжатое целое число \ fnm.X Резервное копирование byte.x Null byte.Z То же, что и, за исключением того, что null добавляется с *.


Пример:

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

a = [ "a", "b", "c" ]

n = [ 65, 66, 67 ]

a.pack ("A3A3A3") # => "abc"

a.pack ("a3a3a3") # => " a \ 000 \ 000b \ 000 \ 000c \ 000 \ 000 "

n.pack (" ccc ") # =>" ABC "