Учебники

Рубин — Массивы

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

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

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

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

Есть много способов создать или инициализировать массив. Один из способов — с помощью нового метода класса —

names = Array.new

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

names = Array.new(20)

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

Live Demo

 #! / USR / бен / рубин

 names = Array.new (20)
 ставит names.size # Возвращает 20
 ставит names.length # Это также возвращает 20

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

20
20

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

Live Demo

#!/usr/bin/ruby

names = Array.new(4, "mac")
puts "#{names}"

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

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

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

Live Demo

#!/usr/bin/ruby

nums = Array.new(10) { |e| e = e * 2 }
puts "#{nums}"

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

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

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

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

Еще одна форма создания массива выглядит следующим образом —

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

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

Live Demo

#!/usr/bin/ruby

digits = Array(0..9)
puts "#{digits}"

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

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

Встроенные методы массива

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

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

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

Live Demo

#!/usr/bin/ruby

digits = Array(0..9)
num = digits.at(6)
puts "#{num}"

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

 6

массив & other_array

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

массив * int [или] массив * str

Возвращает новый массив, созданный путем объединения int-копий self. С аргументом String, эквивалентным self.join (str).

массив + other_array

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

массив — other_array

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

массив <=> other_array

Сравнивает str с other_str, возвращая -1 (меньше), 0 (равно) или 1 (больше). Сравнение чувствительно к регистру.

массив | other_array

Возвращает новый массив, объединяя массив с other_array, удаляя дубликаты.

массив << объект

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

массив <=> other_array

Возвращает целое число (-1, 0 или +1), если этот массив меньше, равен или больше, чем other_array.

массив == other_array

Два массива равны, если они содержат одинаковое количество элементов и если каждый элемент равен (согласно Object. ==) соответствующему элементу в другом массиве.

массив [индекс] [или] массив [начало, длина] [или]

массив [диапазон] [или] массив.slice (индекс) [или]

array.slice (начало, длина) [или] array.slice (диапазон)

Возвращает элемент по индексу , или возвращает подмассив, начинающийся с начала и продолжающийся для элементов длины , или возвращает подмассив, указанный диапазоном . Отрицательные индексы отсчитываются в обратном направлении от конца массива (-1 — последний элемент). Возвращает ноль, если индекс (или начальный индекс) находится вне диапазона.

массив [индекс] = объект [или]

массив [начало, длина] = объект или an_array или ноль [или]

array [range] = obj или an_array или nil

Устанавливает элемент в индекс или заменяет подмассив, начинающийся с начала и продолжающийся для элементов длины , или заменяет подмассив, заданный диапазоном . Если индексы превышают текущую емкость массива, массив увеличивается автоматически. Отрицательные индексы будут отсчитываться назад от конца массива. Вставляет элементы, если длина равна нулю. Если nil используется во второй и третьей форме, удаляет элементы из себя .

array.abbrev (pattern = nil)

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

array.assoc (OBJ)

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

array.at (индекс)

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

array.clear

Удаляет все элементы из массива.

array.collect {| item | блок} [или]

array.map {| item | блок}

Вызывает блок один раз для каждого элемента себя . Создает новый массив, содержащий значения, возвращаемые блоком.

array.collect! {| пункт | блок} [или]

array.map! {| пункт | блок}

Вызывает блок один раз для каждого элемента self , заменяя элемент значением, возвращаемым блоком .

array.compact

Возвращает копию себя со всеми удаленными элементами nil .

array.compact!

Удаляет ноль элементов из массива. Возвращает ноль, если не было внесено никаких изменений.

Array.concat (other_array)

Добавляет элементы в other_array к себе .

array.delete (obj) [или]

array.delete (obj) {блок}

Удаляет из себя элементы, равные obj . Если элемент не найден, возвращается ноль . Если задан необязательный блок кода, возвращает результат блока, если элемент не найден.

array.delete_at (индекс)

Удаляет элемент по указанному индексу , возвращая этот элемент, или nil, если индекс выходит за пределы диапазона.

array.delete_if {| item | блок}

Удаляет каждый элемент self, для которого блок оценивается как true.

array.each {| item | блок}

Вызывает блок один раз для каждого элемента в себе , передавая этот элемент в качестве параметра.

array.each_index {| index | блок}

То же, что Array # each, но передает сам индекс элемента вместо самого элемента.

array.empty?

Возвращает true, если массив self не содержит элементов.

array.eql? (другое)

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

array.fetch (index) [или]

array.fetch (индекс, по умолчанию) [или]

array.fetch (index) {| index | блок}

Пытается вернуть элемент по индексу позиции. Если index находится вне массива, первая форма выдает исключение IndexError , вторая форма возвращает значение по умолчанию , а третья форма возвращает значение вызывающего блока , передавая индекс . Отрицательные значения индекса отсчитываются от конца массива.

array.fill (obj) [или]

array.fill (obj, start [, length]) [or]

array.fill (obj, range) [или]

array.fill {| index | блок} [или]

array.fill (start [, length]) {| index | блок} [или]

array.fill (range) {| index | блок}

Первые три формы устанавливают выбранные элементы self в obj . Начало нуля эквивалентно нулю. Длина ноль эквивалентна self.length . Последние три формы заполняют массив значением блока. Блок передается с абсолютным индексом каждого элемента для заполнения.

array.first [или]

array.first (п)

Возвращает первый элемент или первые n элементов массива. Если массив пуст, первая форма возвращает ноль , а вторая форма возвращает пустой массив.

array.flatten

Возвращает новый массив, который является одномерным уплощением этого массива (рекурсивно).

array.flatten!

Выравнивает массив на месте. Возвращает ноль, если не было внесено никаких изменений. (массив не содержит подмассивов.)

array.frozen?

Возвращает true, если массив заморожен (или временно заморожен во время сортировки).

array.hash

Вычисляет хеш-код для массива. Два массива с одинаковым содержимым будут иметь одинаковый хеш-код.

array.include? (объект)

Возвращает true, если obj присутствует в self , иначе false.

array.index (OBJ)

Возвращает индекс первого объекта в себе, который ==, для obj. Возвращает ноль, если совпадений не найдено.

array.indexes (i1, i2, … iN) [или]

array.indices (i1, i2, … iN)

Этот метод устарел в последней версии Ruby, поэтому используйте Array # values_at.

array.indices (i1, i2, … iN) [или]

array.indexes (i1, i2, … iN)

Этот метод устарел в последней версии Ruby, поэтому используйте Array # values_at.

array.insert (index, obj …)

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

array.inspect

Создает версию для печати массива.

array.join (sep = $,)

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

array.last [или] array.last (n)

Возвращает последний элемент (ы) себя . Если массив пуст , первая форма возвращает ноль .

array.length

Возвращает количество элементов в себе . Может быть ноль.

array.map {| item | блок} [или]

array.collect {| item | блок}

Вызывает блок один раз для каждого элемента себя . Создает новый массив, содержащий значения, возвращаемые блоком.

array.map! {| пункт | блок} [или]

array.collect! {| пункт | блок}

Вызывает блок один раз для каждого элемента массива , заменяя элемент значением, возвращаемым блоком.

array.nitems

Возвращает количество ненулевых элементов в self . Может быть ноль.

array.pack (aTemplateString)

Упакует содержимое массива в двоичную последовательность в соответствии с директивами TemplateString. За директивами A, a и Z может следовать счет, который дает ширину результирующего поля. Остальные директивы также могут иметь счетчик, указывающий количество элементов массива для преобразования. Если счетчик является звездочкой (*), все остальные элементы массива будут преобразованы. Любая из директив все еще может сопровождаться подчеркиванием (_), чтобы использовать собственный размер базовой платформы для указанного типа; в противном случае они используют платформенно-независимый размер. Пробелы игнорируются в строке шаблона.

array.pop

Удаляет последний элемент из массива и возвращает его, или nil, если массив пуст.

array.push (obj, …)

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

array.rassoc (ключ)

Поиск по массиву, элементы которого также являются массивами. Сравнивает ключ со вторым элементом каждого содержащегося в нем массива, используя ==. Возвращает первый содержащийся массив, который соответствует.

array.reject {| item | блок}

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

array.reject! {| пункт | блок}

Удаляет элементы из массива, для которого блок оценивается как true , но возвращает nil, если не было внесено никаких изменений. Эквивалентно Array # delete_if.

array.replace (other_array)

Заменяет содержимое массива содержимым other_array , укорачивая или расширяя при необходимости.

array.reverse

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

array.reverse!

Обращает массив на месте.

array.reverse_each {| item | блок}

То же, что и для массива #, но перемещает массив в обратном порядке.

array.rindex (OBJ)

Возвращает индекс последнего объекта в массиве == в obj. Возвращает ноль, если совпадений не найдено.

array.select {| item | блок}

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

Array.shift

Возвращает первый элемент self и удаляет его (сдвигая все остальные элементы вниз на один). Возвращает ноль, если массив пуст.

array.size

Возвращает длину массива (количество элементов). Псевдоним для длины.

array.slice (index) [или] array.slice (начало, длина) [или]

array.slice (range) [or] array [index] [или]

массив [начало, длина] [или] массив [диапазон]

Возвращает элемент по индексу , или возвращает подмассив, начинающийся с начала и продолжающийся для элементов длины , или возвращает подмассив, указанный диапазоном . Отрицательные индексы отсчитываются в обратном направлении от конца массива (-1 — последний элемент). Возвращает ноль, если индекс (или начальный индекс) находится вне диапазона.

array.slice! (index) [или] array.slice! (start, length) [или]

array.slice! (диапазон)

Удаляет элемент (ы), заданный индексом (необязательно с длиной) или диапазоном . Возвращает удаленный объект, подмассив или ноль, если индекс выходит за пределы диапазона.

array.sort [или] array.sort {| а, б | блок}

Возвращает новый массив, созданный сортировкой self.

Array.sort! [или] array.sort! {| а, б | блок}

Сортирует себя.

array.to_a

Возвращает себя . Если вызывается для подкласса Array , преобразует получателя в объект Array.

array.to_ary

Возвращает себя.

array.to_s

Возвращает self.join.

array.transpose

Предполагается, что self является массивом массивов и транспонирует строки и столбцы.

array.uniq

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

array.uniq!

Удаляет дубликаты элементов от себя . Возвращает ноль, если не было внесено никаких изменений (то есть дубликаты не найдены).

array.unshift (obj, …)

Добавляет объекты в начало массива, остальные элементы — в один.

array.values_at (селектор, …)

Возвращает массив, содержащий элементы в self, соответствующие данному селектору (один или несколько). Селекторы могут быть целочисленными индексами или диапазонами.

array.zip (arg, …) [or]

array.zip (arg, …) {| обр | блок}

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

Директива по массиву

@

Перемещается в абсолютную позицию.

Строка ASCII (пробел дополняется, число равно ширине).

Строка ASCII (заполнено нулями, число равно ширине).

В

строка (нисходящий битовый порядок).

б

Битовая строка (возрастающий битовый порядок).

С

Неподписанный символ

с

Char.

D, D

Поплавок двойной точности, нативный формат.

Е

Поплавок двойной точности, порядок байтов в младшем порядке.

е

Поплавок одинарной точности, порядок байтов в младшем порядке.

F, F

Поплавок одинарной точности, нативный формат.

г

Поплавок двойной точности, сетевой (байтовый) порядок байтов.

г

Плавающая последовательность одинарной точности, сетевой (байтовый) порядок байтов.

ЧАС

Шестнадцатеричная строка (сначала высокий клев).

час

Шестнадцатеричная строка (сначала низкий клев)

я

Целое число без знака.

я

Integer.

L

Без подписи долго.

L

Долго.

M

Котируемая для печати, кодировка MIME (см. RFC 2045).

м

Строка в кодировке Base64.

N

Длинный сетевой порядок байтов.

N

Короткий, сетевой (big-endian) порядок байтов.

п

Указатель на структуру (строка фиксированной длины).

п

Указатель на строку с нулевым символом в конце.

Q, q

64-битное число.

S

Подпись короткая.

s

Короткий.

U

UTF-8.

U

UU-кодированная строка.

В

Длинный порядок байтов с прямым порядком байтов.

v

Короткий порядок байтов с прямым порядком байтов.

вес

BER-сжатое целое число \ fnm.

Икс

Резервное копирование байта.

Икс

Нулевой байт.

Z

То же, что a, за исключением того, что null добавляется с помощью *.

пример

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

Live Demo

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"

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