Тип 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
Хэши — это изменяемые коллекции, в которых есть несколько операторов для запроса и управления ими. Вот некоторые распространенные примеры:
Операция | Описание |
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 {pop} |
P к } | people." |
hash.each value { | End |
|v| p v } | |
hash.has key?(key) | Проверяет, существует ли данный ключ или значение в хеш-структуре. |
hash.has value?(val) | |
hash.key for(value) | Находит пару с заданным значением и возвращает ее ключ. Эта операция является дорогостоящей, поскольку ей приходится искать все пары одну за другой. |
hash.key for?(value) | |
hash.keys | Создает массив всех ключей или массив всех значений хеша. |
hash.values |
В качестве интересной задачи давайте посмотрим, как получить общую численность населения всех стран вместе взятых. Мы можем использовать метод значений, чтобы получить массив счетчиков населения, а затем вызвать метод суммы для этого массива, чтобы агрегировать его:
puts "Total population: #{population.values.sum}"
Если вы попробуете этот код, вы увидите, что он не работает со следующим сообщением об ошибке:
Unhandled exception: Arithmetic overflow (OverflowError)