Ruby Массивы

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

Индексация массивов начинается с 0, как в C или Java. Отрицательный индекс отсчитывается от конца массива. То есть индекс -1 указывает на последний элемент массива, -2 — на предпоследний элемент, и так далее.

Массивы Ruby могут хранить такие объекты, как String, Integer, Fixnum, Hash, Symbol и даже другие объекты Array.

Массивы Ruby не требуют указания размера. Когда элементы добавляются в массив, массивы Ruby автоматически увеличиваются.

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

Существует несколько способов создать или инициализировать массив. Один из способов — через метод классаnew:

names = Array.new

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

names = Array.new(20)

Массивnamesимеет размер или длину 20 элементов. Вы можете использовать метод size или length, чтобы вернуть размер массива:

Пример

#!/usr/bin/ruby names = Array.new(20) puts names.size #возвращает 20 puts names.length #возвращает 20

Попробуйте »

Вывод приведенного выше примера:

20
20

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

Пример

#!/usr/bin/ruby names = Array.new(4, "mac") puts "#{names}"

Попробуйте »

Вывод приведенного выше примера:

["mac", "mac", "mac", "mac"]

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

Пример

#!/usr/bin/ruby nums = Array.new(10) { |e| e = e * 2 } puts "#{nums}"

Попробуйте »

Вывод приведенного выше примера:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Существует также другой метод для массивов, [], как показано ниже:

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}"

Вывод приведенного выше примера:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Встроенные методы Array

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

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

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

Пример

#!/usr/bin/ruby digits = Array(0..9) num = digits.at(6) puts "#{num}"

Вывод приведенного выше примера:

6

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

Нет.Метод и описание
1array & other_array
Возвращает новый массив, содержащий элементы, общие для обоих массивов, без дубликатов.
2array * int [или] array * str
Возвращает новый массив, созданный путем конкатенации int копий self. С аргументом String эквивалентно self.join(str).
3array + other_array
Возвращает новый массив, созданный путем конкатенации двух массивов для получения третьего массива.
4array - other_array
Возвращает новый массив, который является копией исходного массива с удаленными элементами, присутствующими в other_array.
5str <=> other_str
Сравнивает str с other_str, возвращая -1 (меньше), 0 (равно) или 1 (больше). Сравнение учитывает регистр.
6array | other_array
Возвращает новый массив путем добавления other_array к массиву и удаления дубликатов.
7array << obj
Добавляет заданный объект в конец массива. Выражение возвращает сам массив, поэтому несколько добавлений можно объединять в цепочку.
8array <=> other_array
Возвращает целое число (-1, 0 или +1), если массив меньше, равен или больше other_array.
9array == other_array
Два массива равны, если они содержат одинаковое количество элементов и каждый элемент равен соответствующему элементу в другом массиве (согласно Object.==).
10array[index] [или] array[start, length] [или]
array[range] [или] array.slice(index) [или]
array.slice(start, length) [или] array.slice(range)

Возвращает элемент с индексомindex, или возвращает подмассив, начиная с startstartдо lengthlengthэлементы, или возвращаетrangeподмассив, заданный range. Отрицательные индексы отсчитываются от конца массива (-1 — последний элемент). Если индексindex(или начальный индекс) находится вне диапазона, возвращаетnil。
11array[index] = obj [or]
array[start, length] = obj or an_array or nil [or]
array[range] = obj or an_array or nil

Устанавливает элемент по индексуindex, или заменяет подмассив от началаstartдо длиныlengthэлементы, или заменяет подмассив, заданныйrange. Если индекс больше текущей вместимости массива, массив автоматически увеличивается. Отрицательные индексы отсчитываются от конца массива. Если lengthlengthравна нулю, элементы вставляются. Если rangenilиспользуется во второй или третьей форме, то изselfудаляются элементы.
12array.abbrev(pattern = nil)
isselfСтроки в нём формируют явный набор сокращений. Если передан шаблон или строка, рассматриваются только случаи, когда строка соответствует шаблону или начинается с этой строки.
13array.assoc(obj)
Выполняет поиск в массиве, элементы которого также являются массивами, используя obj.== для сравнения obj с первым элементом каждого содержащегося массива. Если совпадение найдено, возвращает первый содержащийся массив; если совпадение не найдено, возвращаетnil。
14array.at(index)
Возвращает элемент по индексу. Отрицательный индекс отсчитывается отselfконца массива. Возвращает nil, если индекс вне диапазона.
15array.clear
Удаляет все элементы из массива.
16array.collect { |item| block } [или]
array.map { |item| block }

являетсяselfВызывает блок один раз для каждого элемента вblock. Создаёт новый массив, содержащий значения, возвращённые блоком.
17array.collect! { |item| block } [или]
array.map! { |item| block }

являетсяselfВызывает блок один раз для каждого элемента вblock, заменяя элемент наblockзначение, возвращённое блоком.
18array.compact
Возвращает копиюself, из которой удалены всеnilэлементы.
19array.compact!
Удаляет всеnilэлементы из массива. Если изменений нет, возвращаетnil。
20array.concat(other_array)
Добавляет элементы other_array кself.
21array.delete(obj) [или]
array.delete(obj) { block }

изselfУдаляет из массива элемент, равныйobjobj. Если равный элемент не найден, возвращаетnil. Если равный элемент не найден и необязательный кодblockзадан, возвращаетblockрезультат блока.
22array.delete_at(index)
Удаляет элемент по указанномуindexindex и возвращает этот элемент. Если индекс вне диапазона, возвращаетnil。
23array.delete_if { |item| block }
Когдаblockистинно, удаляет изselfкаждый элемент массива.
24array.each { |item| block }
являетсяselfВызывает block один раз для каждого элемента вblock, передавая элемент как аргумент.
25array.each_index { |index| block }
То же, что и Array#each, но передаёт индекс элементаindexindex вместо самого элемента.
26array.empty?
Возвращает true, если сам массив не содержит элементов.
27array.eql?(other)
Возвращает true, еслиarrayиotherявляются одним и тем же объектом, или если два массива имеют одинаковое содержимое.
28array.fetch(index) [or]
array.fetch(index, default) [or]
array.fetch(index) { |index| block }

Пытается вернуть элемент в позицииindex. Еслиindexнаходится вне массива, первая форма выбрасываетIndexErrorисключение, вторая форма возвращаетdefault, а третья форма возвращает результат вызоваblockблок сindexиндекс как аргумент. Отрицательныеindexиндексы отсчитываются от конца массива.
29array.fill(obj) [или]
array.fill(obj, start [, length]) [или]
array.fill(obj, range) [или]
array.fill { |index| block } [или]
array.fill(start [, length] ) { |index| block } [или]
array.fill(range) { |index| block }

Первые три формы устанавливаютselfвыбранные элементы self вobjobj. Anilначало nil эквивалентно нулю.nilДлина nil эквивалентнаself.lengthдлине self. Последние три формы используют значение блока, чтобы заполнитьэтотмассив.блокБлоку передаётся абсолютный индекс каждого заполняемого элемента.
30array.first [или]
array.first(n)

Возвращает первый элемент или первыеnэлементы. Если массив пуст, первая форма возвращаетnil, а вторая форма возвращает пустой массив.
31array.flatten
Возвращает новый массив, который является одномерным уплощённым массивом (рекурсивно).
32array.flatten!
ВозвращаетмассивВыполняет уплощение. Если изменений нет, возвращаетnil. (Массив не содержит подмассивов.)
33array.frozen?
Возвращает true, еслимассивзаморожен (или временно заморожен во время сортировки).
34array.hash
Вычисляет хеш-код для массива. Два массива с одинаковым содержимым будут иметь одинаковый хеш-код.
35array.include?(obj)
Возвращает true, еслиselfсодержитobj, тогда возвращает true, иначе false.
36array.index(obj)
Возвращаетselfиндекс первого объекта, равного obj, вindex. Если совпадение не найдено, возвращаетnil。
37array.indexes(i1, i2, ... iN) [или]
array.indices(i1, i2, ... iN)

Этот метод устарел в последней версии Ruby, поэтому используйте Array#values_at.
38array.indices(i1, i2, ... iN) [или]
array.indexes(i1, i2, ... iN)

Этот метод устарел в последней версии Ruby, поэтому используйте Array#values_at.
39array.insert(index, obj...)
по заданномуindexindex, вставьте заданное значение перед элементом; index может быть отрицательным.
40array.inspect
Создаёт печатную версию массива.
41array.join(sep=$,)
Возвращает строку, созданную преобразованием каждого элемента массива в строку и использованиемsepв качестве разделителя для их объединения.
42array.last [или] array.last(n)
Возвращает последний элементself. Если массивпуст, первая форма возвращаетnil。
43array.length
Возвращает количество элементов вself. Может быть нулевым.
44array.map { |item| block } [или]
array.collect { |item| block }

вызываетсяselfодин раз для каждого элементаblock. Создает новый массив, содержащий значения, возвращаемые блоком.
45array.map! { |item| block } [или]
array.collect! { |item| block }

вызываетсяarrayодин раз для каждого элементаblock, заменяя элемент значением, возвращаемым блоком.
46array.nitems
Возвращает количество не-nil элементов вself. Может быть нулём.
47array.pack(aTemplateString)
Упаковывает содержимое массива в двоичную последовательность в соответствии с директивами в aTemplateString. После директив A, a и Z может следовать число, указывающее ширину результирующего поля. Остальные директивы также могут принимать число, указывающее количество элементов массива для преобразования. Если число — это звёздочка (*), все оставшиеся элементы массива будут преобразованы. После любой директивы может следовать подчёркивание (_), указывающее, что указанный тип использует собственный размер базовой платформы; в противном случае используется независимый от платформы согласованный размер. Пробелы в строке шаблона игнорируются.
48array.pop
Удаляет последний элемент изarrayи возвращает его. Еслиarrayпуст, возвращаетnil。
49array.push(obj, ...)
Добавляет заданный obj в конец массива. Выражение возвращает сам массив, поэтому несколько добавлений можно объединять в цепочку.
50array.rassoc(key)
Ищет массив, элементы которого также являются массивами, используя == для сравненияkeyсо вторым элементом каждого содержащегося массива. Если совпадение найдено, возвращает первый содержащийся массив.
51array.reject { |item| block }
Возвращает новый массив, содержащий элементы массива, для которых блок не является истинным.
52array.reject! { |item| block }
Когда блок истинен, удаляет элементы изarray. Если изменений нет, возвращаетnil. Эквивалентно Array#delete_if.
53array.replace(other_array)
держатьarrayЗаменяет содержимое на содержимоеother_array, усекая или расширяя при необходимости.
54array.reverse
Возвращает новый массив, содержащий элементы массива в обратном порядке.
55array.reverse!
holdarrayИзменяет порядок на обратный.
56array.reverse_each {|item| block }
То же, что и Array#each, ноarrayперебирает в обратном порядке.
57array.rindex(obj)
Возвращает индекс последнего объекта в array, равного obj. Если совпадение не найдено, возвращаетnil。
58array.select {|item| block }
Вызывает блок с последовательными элементами массива; возвращает массив, содержащий элементы, для которых блок возвращаетtrueистинное значение.
59array.shift
Возвращает первый элементselfи удаляет его (сдвигая все остальные элементы на одну позицию вниз). Если массив пуст, возвращаетnil。
60array.size
Возвращает длинуarray(количество элементов). Псевдоним для length.
61array.slice(index) [или] array.slice(start, length) [или]
array.slice(range) [или] array[index] [или]
array[start, length] [или] array[range]

Возвращает элемент по индексуindex, или возвращает подмассив, начинающийся сstartи продолжающийся наlengthэлементов, или возвращает подмассив, указанныйrange. Отрицательные индексы отсчитываются от конца массива (-1 — последний элемент). Еслиindex(или начальный индекс) выходит за пределы диапазона, возвращаетnil。
62array.slice!(index) [или] array.slice!(start, length) [или]
array.slice!(range)

Удаляет элемент(ы), указанный(е) с помощьюindex(length необязателен) илиrange. Возвращает удалённый объект, подмассив или, еслиindexвне диапазона, возвращаетnil。
63array.sort [или] array.sort { | a,b | block }
Возвращает отсортированный массив.
64array.sort! [или] array.sort! { | a,b | block }
Сортирует массив.
65array.to_a
Возвращаетself. Если вызван для подклассаArray, преобразует получателя в объект Array.
66array.to_ary
Возвращает self.
67array.to_s
Возвращает self.join.
68array.transpose
Предполагает, что self — массив массивов, и транспонирует строки и столбцы.
69array.uniq
Возвращает новый массив, в котором изarrayудалены дублирующиеся значения.
70array.uniq!
Удаляет дублирующиеся элементы изself. Если изменений нет (то есть дубликаты не найдены), возвращаетnil。
71array.unshift(obj, ...)
Добавляет объект в начало массива, сдвигая остальные элементы на одну позицию вверх.
72array.values_at(selector,...)
Возвращает массив, содержащий элементы self, соответствующие заданномуselectorselector(s). Селекторы могут быть целочисленными индексами или диапазонами.
73array.zip(arg, ...) [или]
array.zip(arg, ...){ | arr | block }

Преобразует любые аргументы в массивы, затем объединяет элементымассивас соответствующими элементами из каждого аргумента.

Директивы pack для Array

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

ДирективаОписание
@Перемещает в абсолютную позицию.
AСтрока ASCII (с заполнением пробелами, count — ширина).
aСтрока ASCII (с заполнением нулями, count — ширина).
BБитовая строка (нисходящий порядок битов)
bБитовая строка (восходящий порядок битов).
CБеззнаковый символ.
cСимвол.
D, dЧисло с плавающей запятой двойной точности, собственный формат.
EЧисло с плавающей запятой двойной точности, порядок байтов little-endian.
eЧисло с плавающей запятой одинарной точности, порядок байтов little-endian.
F, fЧисло с плавающей запятой одинарной точности, машинный формат.
GЧисло с плавающей запятой двойной точности, сетевой (big-endian) порядок байтов.
gЧисло с плавающей запятой одинарной точности, сетевой (big-endian) порядок байтов.
HШестнадцатеричная строка (сначала старший полубайт).
hШестнадцатеричная строка (сначала младший полубайт).
IЦелое число без знака.
iЦелое число.
LДлинное целое без знака.
lДлинное целое.
MQuoted printable, кодировка MIME.
mСтрока в кодировке Base64.
NLong, сетевой (big-endian) порядок байтов.
nShort, сетевой (big-endian) порядок байтов.
PУказатель на структуру (строка фиксированной длины).
pУказатель на строку с завершающим нулем.
Q, q64-битное число.
SБеззнаковый short.
sShort.
UUTF-8.
uСтрока в кодировке UU.
VLong, порядок байтов little-endian.
vShort, порядок байтов little-endian.
wBER-сжатое целое число \\fnm.
XПропускает на один байт назад.
xНулевой байт.
ZТо же, что и a, но нулевой байт добавляется с *.

Пример

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

Пример

a = [ "a", "b", "c" ] n = [ 65, 66, 67 ] puts a.pack("A3A3A3") #=> "a b c " puts a.pack("a3a3a3") #=> "a\000\000b\000\000c\000\000" puts n.pack("ccc") #=> "ABC"

Вывод приведенного выше примера:

a  b  c
abc
ABC
Другие расширения