litbaza книги онлайнРазная литератураCrystal Programming. Введение на основе проекта в создание эффективных, безопасных и читаемых веб-приложений и приложений CLI - Джордж Дитрих

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 10 11 12 13 14 15 16 17 18 ... 75
Перейти на страницу:
стандартные модули Indexable, Enumerable и Iterable, предоставляя несколько полезных методов для исследования коллекции и управления ею.

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

list = {1, 2, "abc", 40}

p typeof(list) # => Tuple(Int32, Int32, String, Int32)

element = list[0]

p typeof(element) # => Int32

list << 10 # Invalid, tuples are immutable.

Поскольку кортежи неизменяемы, они используются не так часто, как массивы.

И массивы, и кортежи имеют несколько полезных методов. Вот некоторые из наиболее распространенных:

Таблица 2.7 – Общие операции с контейнерами Array и Tuple

Операция Описание list [index] Считывает элемент по заданному индексу. Вызывает ошибку времени выполнения, если этот индекс выходит за пределы. Если список представляет собой кортеж, а индекс — целое число, ошибка выхода за пределы будет обнаружена во время компиляции. list[index]? Аналогично list [index], но возвращает ni1, если индекс выходит за пределы. list.size Возвращает количество элементов внутри кортежа или массива. array[index] = value Заменяет значение по заданному индексу или повышает, если индекс выходит за пределы. Поскольку кортежи неизменяемы, это доступно только для массивов. array << value array.push(value) Добавляет новое значение в конец массива, увеличивая его размер на единицу. array.pop array.pop? Удаляет и возвращает последний элемент массива. В зависимости от варианта он может поднимать или возвращать ноль в пустых массивах. array.shift array.shift? Аналогично pop, но удаляет и возвращает первый элемент массива, уменьшая его размер на единицу. array.unshift(value) Добавляет новое значение в начало массива, увеличивая его размер на единицу. Это противоположность сдвигу.

Операция Описание array.sort Реорганизует элементы массива, чтобы обеспечить их упорядоченность. Другой полезный вариант — сортировка по методу, при которой для получения критериев сортировки требуется блок. Первый вариант возвращает отсортированную копию массива, а второй сортирует на месте. array.sort! array.shuffle array.shuffle! Реорганизует элементы массива случайным образом. Все перестановки имеют одинаковую вероятность. Первый вариант возвращает перетасованную копию массива; второй шаркает на месте. list.each do el puts el Перебирает элементы коллекции. Порядок сохранен. end list.find do el Возвращает первый элемент массива или кортежа, соответствующий заданному условию. Если ни одно не соответствует, возвращается nil.    el > 3 end list.map do el Преобразует каждый элемент списка, применяя к нему блок, возвращая новую коллекцию (массив или кортеж) с новыми элементами в том же порядке. У массива также есть карта! метод, который изменяет элементы на месте.    el + 1 end list.select do el Возвращает новый массив, отфильтрованный по условию в блоке. Если ни один элемент не соответствует, массив будет пустым. Существует также функция reject, которая выполняет противоположную операцию, фильтруя несовпадающие элементы. Для массивов доступны варианты на месте путем добавления ! к имени метода.    el > 3 end

Не все данные упорядочены или последовательны. Для них существуют другие контейнеры данных, например хэш.

Хэш

Тип Hash представляет собой сопоставление ключей словаря со значениями. Ключи могут иметь любой тип, то же самое касается и значений. Единственное ограничение состоит в том, что каждый ключ может иметь только одно значение, хотя само значение может быть другим контейнером данных, например массивом.

Буквальный хэш создается как список пар ключ-значение внутри фигурных скобок ({...}). Ключ отделяется от значения символом =>. Например, вот самая большая численность населения в мире по странам, по данным Worldometer:

population = {

    "China" => 1_439_323_776,

    "India" => 1_380_004_385,

    "United States" => 331_002_651,

    "Indonesia" => 273_523_615,

    "Pakistan" => 220_892_340,

    "Brazil" => 212_559_417,

    "Nigeria" => 206_139_589,

    "Bangladesh" => 164_689_383,

    "Russia" => 145_934_462,

    "Mexico" => 128_932_753,

}

Переменная населения имеет тип Hash(String, Int32) и состоит из 10 элементов.

Типы ключей и значений выводятся из использования, но если вам нужно объявить пустой хэш, типы необходимо будет указать явно, как и массивы:

population = {} of String => Int32

Хэши — это изменяемые коллекции, в которых есть несколько операторов для запроса и управления ими. Вот некоторые распространенные примеры:

Таблица 2.8 – Общие операции с хеш-контейнерами

Операция Описание hash[key] Считывает значение по заданному ключу. Если ключ не существует, это вызовет ошибку времени выполнения. Например, население ["India"] составляет 1380004385 человек. hash[key]? Считывает значение по заданному ключу, но если ключ не существует, вместо выдачи ошибки возвращается ni 1. Например, население ["India"]? 13 8 00 043 8 5 и население ["Mars"] ? равен nil. Hash [key] = value Заменяет значение данного ключа, если оно существует. В противном случае к хешу добавляется новая пара ключ-значение.

Операция Описание hash.delete(key) Находит и удаляет пару, определенную данным ключом. Если он был найден, возвращается удаленное значение; в противном случае возвращается nil. hash.each { k, v p k, v } Перебирает элементы, хранящиеся в хеше. Перечисление следует порядку, в котором были вставлены ключи. Вот пример: hash.each key { к population.each do country, pop puts "#{country} has
1 ... 10 11 12 13 14 15 16 17 18 ... 75
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?