Рубин - Массивы
Массивы Ruby - это упорядоченные коллекции любого объекта с целочисленным индексом. Каждый элемент в массиве связан с индексом и ссылается на него.
Индексация массива начинается с 0, как в C или Java. Отрицательный индекс предполагается относительно конца массива, то есть индекс -1 указывает последний элемент массива, -2 - предпоследний элемент в массиве и т. Д.
Массивы Ruby могут содержать такие объекты, как String, Integer, Fixnum, Hash, Symbol и даже другие объекты Array. Массивы Ruby не такие жесткие, как массивы в других языках. Массивы Ruby автоматически увеличиваются при добавлении к ним элементов.
Создание массивов
Есть много способов создать или инициализировать массив. Один из способов - использовать новый метод класса -
names = Array.new
Вы можете установить размер массива во время создания массива -
names = Array.new(20)
Имена массивов теперь имеют размер или длину 20 элементов. Вы можете вернуть размер массива с помощью методов размера или длины -
#!/usr/bin/ruby
names = Array.new(20)
puts names.size # This returns 20
puts names.length # This also returns 20
Это даст следующий результат -
20
20
Вы можете присвоить значение каждому элементу в массиве следующим образом:
#!/usr/bin/ruby
names = Array.new(4, "mac")
puts "#{names}"
Это даст следующий результат -
["mac", "mac", "mac", "mac"]
Вы также можете использовать блок с новым, заполняя каждый элемент тем, что оценивает блок -
#!/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, который принимает только один аргумент. Здесь метод принимает диапазон в качестве аргумента для создания массива цифр -
#!/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] [...]
Это вернет новый массив, заполненный данными объектами. Теперь, используя созданный объект, мы можем вызывать любые доступные методы экземпляра. Например -
#!/usr/bin/ruby
digits = Array(0..9)
num = digits.at(6)
puts "#{num}"
Это даст следующий результат -
6
| Sr. No. | Методы и описание |
|---|---|
| 1 | array & other_array Возвращает новый массив, содержащий элементы, общие для двух массивов, без дубликатов. |
| 2 | array * int [or] array * str Возвращает новый массив, созданный путем объединения копий int типа self. С аргументом String, эквивалентным self.join (str). |
| 3 | array + other_array Возвращает новый массив, построенный путем объединения двух массивов вместе для создания третьего массива. |
| 4 | array - other_array Возвращает новый массив, который является копией исходного массива, удаляя все элементы, которые также появляются в other_array. |
| 5 | array <=> other_array Сравнивает 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 - последний элемент). Возвращает nil, если индекс (или начальный индекс) выходит за пределы допустимого диапазона. |
| 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, для которого значение блока истинно. |
| 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] ) { |index| 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? Возвращает true, если массив заморожен (или временно заморожен во время сортировки). |
| 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) Упаковывает содержимое массива в двоичную последовательность в соответствии с директивами в TemplateString. За директивами A, a и Z может следовать счетчик, который дает ширину результирующего поля. Остальные директивы также могут иметь счетчик, указывающий количество элементов массива для преобразования. Если счетчик обозначен звездочкой (*), все оставшиеся элементы массива будут преобразованы. Любая из директив по-прежнему может сопровождаться подчеркиванием (_), чтобы использовать собственный размер базовой платформы для указанного типа; в противном случае они используют размер, не зависящий от платформы. Пробелы в строке шаблона игнорируются. |
| 48 | array.pop Удаляет последний элемент из массива и возвращает его, или ноль, если массив пуст. |
| 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 { | a,b | block } Возвращает новый массив, созданный путем сортировки self. |
| 64 | array.sort! [or] array.sort! { | a,b | 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 } Преобразует любые аргументы в массивы, затем объединяет элементы массива с соответствующими элементами из каждого аргумента. |
Директивы пакета массивов
| Sr. No. | Директива и описание |
|---|---|
| 1 | @ Перемещается в абсолютное положение. |
| 2 | A Строка ASCII (заполнена пробелами, количество равно ширине). |
| 3 | a Строка ASCII (заполнена нулем, количество равно ширине). |
| 4 | B строка (в порядке убывания битов). |
| 5 | b Битовая строка (возрастающий битовый порядок). |
| 6 | C Беззнаковый символ. |
| 7 | c Char. |
| 8 | D, d Число с плавающей запятой двойной точности, собственный формат. |
| 9 | E Число с плавающей запятой двойной точности, порядок байтов с прямым порядком байтов. |
| 10 | e Число с плавающей запятой одинарной точности, порядок байтов с прямым порядком байтов. |
| 11 | F, f Число с плавающей точкой одинарной точности, собственный формат. |
| 12 | G Число с плавающей запятой двойной точности, сетевой порядок байтов (прямой порядок байтов). |
| 13 | g Число с плавающей запятой одинарной точности, сетевой порядок байтов (с прямым порядком байтов). |
| 14 | H Шестигранная нить (сначала большой полубайт). |
| 15 | h Шестнадцатеричная строка (сначала малый полубайт). |
| 16 | I Беззнаковое целое. |
| 17 | i Целое число. |
| 18 | L Без подписи долго. |
| 19 | l Долго. |
| 20 | M Цитируется для печати, кодировка MIME (см. RFC 2045). |
| 21 год | m Строка в кодировке Base64. |
| 22 | N Длинный сетевой порядок байтов (с прямым порядком байтов). |
| 23 | n Короткий сетевой (с прямым порядком байтов) порядок байтов. |
| 24 | P Указатель на структуру (строка фиксированной длины). |
| 25 | p Указатель на строку с завершающим нулем. |
| 26 | Q, q 64-битное число. |
| 27 | S Беззнаковый короткий. |
| 28 | s Короткий. |
| 29 | U UTF-8. |
| 30 | u Строка в кодировке UU. |
| 31 год | V Длинный порядок байтов с прямым порядком байтов. |
| 32 | v Короткий порядок байтов с прямым порядком байтов. |
| 33 | w Целое число со сжатием BER \ fnm. |
| 34 | X Сделайте резервную копию байта. |
| 35 год | x Нулевой байт. |
| 36 | Z То же, что и a, за исключением того, что null добавляется с *. |
пример
Попробуйте следующий пример для упаковки различных данных.
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