Учебники

Рубин — Хэши

Хеш — это набор пар ключ-значение, таких как: «employee» => «salary». Он похож на массив, за исключением того, что индексирование выполняется с помощью произвольных ключей любого типа объекта, а не целочисленного индекса.

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

Создание хэшей

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

months = Hash.new

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

months = Hash.new( "month" )

or

months = Hash.new "month"

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

Live Demo

#!/usr/bin/ruby

months = Hash.new( "month" )

puts "#{months[0]}"
puts "#{months[72]}"

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

month
month

Live Demo

#!/usr/bin/ruby

H = Hash["a" => 100, "b" => 200]

puts "#{H['a']}"
puts "#{H['b']}"

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

100
200

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

[1,"jan"] => "January"

Встроенные методы хэширования

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

Hash[[key =>|, value]* ] or

Hash.new [or] Hash.new(obj) [or]
Hash.new { |hash, key| block }

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

Live Demo

#!/usr/bin/ruby

$, = ", "
months = Hash.new( "month" )
months = {"1" => "January", "2" => "February"}

keys = months.keys
puts "#{keys}"

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

["1", "2"]

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

хэш == другой_хэш

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

хэш. [ключ]

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

хеш. [ключ] = значение

Связывает значение, заданное значением, с ключом, заданным ключом .

hash.clear

Удаляет все пары ключ-значение из хэша.

hash.default (ключ = ноль)

Возвращает значение по умолчанию для хэша , nil, если не установлено по умолчанию =. ([] возвращает значение по умолчанию, если ключ не существует в хэше .)

hash.default = obj

Устанавливает значение по умолчанию для хэша .

hash.default_proc

Возвращает блок, если хеш был создан блоком.

hash.delete (ключ) [или]

array.delete (key) {| ключ | блок}

Удаляет пару ключ-значение из хеша по ключу . Если используется блок, возвращает результат блока, если пара не найдена. Сравните delete_if .

hash.delete_if {| ключ, значение | блок}

Удаляет пару ключ-значение из хэша для каждой пары, для которой блок оценивается как true .

hash.each {| ключ, значение | блок}

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

hash.each_key {| ключ | блок}

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

hash.each_key {| key_value_array | блок}

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

hash.each_key {| value | блок}

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

hash.empty?

Проверяет, является ли хеш пустым (не содержит пар ключ-значение), возвращает true или false .

hash.fetch (ключ [, по умолчанию]) [или]

hash.fetch (ключ) {| ключ | блок}

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

hash.has_key? (ключ) [или] hash.include? (ключ) [или]

hash.key? (ключ) [или] hash.member? (ключ)

Проверяет, присутствует ли данный ключ в хэше, возвращая true или false .

hash.has_value? (значение)

Проверяет, содержит ли хеш заданное значение .

hash.index (значение)

Возвращает ключ для заданного значения в хэше, nil, если не найдено подходящего значения.

hash.indexes (ключи)

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

hash.indices (ключи)

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

hash.inspect

Возвращает красивую строковую версию хэша.

hash.invert

Создает новый хеш , инвертируя ключи и значения из хеша ; то есть в новом хеше ключи из хэша становятся значениями, а значения становятся ключами.

hash.keys

Создает новый массив с ключами из хэша .

hash.length

Возвращает размер или длину хэша в виде целого числа.

hash.merge (other_hash) [или]

hash.merge (other_hash) {| ключ, oldval, newval | блок}

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

hash.merge! (other_hash) [или]

hash.merge! (other_hash) {| ключ, oldval, newval | блок}

То же, что слияние, но изменения выполняются на месте.

hash.rehash

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

hash.reject {| ключ, значение | блок}

Создает новый хэш для каждой пары, блок оценивается как истинный

hash.reject! {| ключ, значение | блок}

То же самое, что отклонить , но изменения сделаны на месте.

hash.replace (other_hash)

Заменяет содержимое хеша на содержимое other_hash .

hash.select {| ключ, значение | блок}

Возвращает новый массив, состоящий из пар ключ-значение из хеша, для которого блок возвращает true .

hash.shift

Удаляет пару ключ-значение из хэша , возвращая ее в виде двухэлементного массива.

hash.size

Возвращает размер или длину хэша в виде целого числа.

hash.sort

Преобразует хэш в двумерный массив, содержащий массивы пар ключ-значение, а затем сортирует его как массив.

hash.store (ключ, значение)

Сохраняет пару ключ-значение в хэше .

hash.to_a

Создает двумерный массив из хеша. Каждая пара ключ / значение преобразуется в массив, и все эти массивы хранятся в содержащем массиве.

hash.to_hash

Возвращает хеш (self).

hash.to_s

Преобразует хеш в массив, затем преобразует этот массив в строку.

hash.update (other_hash) [или]

hash.update (other_hash) {| ключ, oldval, newval | блок}

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

hash.value? (значение)

Проверяет, содержит ли хеш заданное значение .

hash.values

Возвращает новый массив, содержащий все значения хеша .

hash.values_at (obj, …)

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