Главная Обратная связь

Дисциплины:






Доступ к парам ключ-значение и добавление новых пар



В классе Hash есть методы класса [] и []=. Используются они почти так же, как одноименные методы в классе Array, но принимают лишь один параметр. В качестве параметра может выступать любой объект, а не только строка (хотя строки используются чаще всего).

а = {}

а["flat"] = 3 # {"flat"=>3}

а.[]=("curved",2) # {"flat"=>3,"curved"=>2}

a.store("angled",5) # {"flat"=>3,"curved"=>2,"angled"=>5}

Метод store — просто синоним []=, оба могут принимать два аргумента, как показано в примере выше.

Метод fetch аналогичен методу [], но возбуждает исключение IndexError, когда ключ отсутствует. Есть у него и необязательный второй аргумент (или блок) для указания значения по умолчанию (см. раздел 8.2.2).

a["flat"] # 3

а.[]("flat") # 3

a.fetch("flat") # 3

a["bent"] # nil

Предположим, что мы не уверены, существует ли объект Hash, но хотели бы избежать очистки имеющегося хэша. Очевидное решение — проверить, определен ли интересующий нас объект:

unless defined? а

а={}

end

a["flat"] = 3

Но есть и другой способ:

а ||= {}

a["flat"] = 3

# Или даже так:

(а ||= {})["flat"] = 3

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

a=Hash.new(99)

а[2] # 99

а # {}

а[2] ||= 5 # 99

а # {}

b=Hash.new

b # {}

b[2] # nil

b[2] ||= 5 # 5

b # {2=>5}

Отметим, что nil может выступать и в качестве ключа, и в качестве значения:

b={}

b[2] # nil b[3]=nil

b # {3=>nil}

b[2].nil? # true

b[3].nil? # true b[nil]=5

b # {3=>nil,nil=>5}

b[nil] # 5

b[b[3]] # 5

Удаление пар ключ-значение

Удалить пары ключ-значение из хэша можно с помощью методов clear, delete, delete_if, reject, reject! и shift.

Метод clear удаляет из хэша все пары. Эффект такой же, как от присваивания переменной нового пустого хэша, но работает чуть быстрее.

Метод shift удаляет незаданную пару ключ-значение и возвращает ее в виде массива из двух элементов или nil, если никаких ключей не осталось.

a = {1=>2, 3=>4}

b = a.shift # [1,2]

# а равно {3=>4}

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



a = (1=>1, 2=>4, 3=>9, 4=>16)

a.delete(3) # 9

# a is now {1=>1, 2 =>4, 4=>16)

a.delete(5) # в этом случае nil.

delete(6) { "не найдено" } # "не найдено".

Пользуйтесь методами delete_if, reject или reject! в сочетании с обязательны блоком, чтобы удалить все ключи, для которых блок возвращает значение true. Метод reject работает с копией хэша, а метод reject! возвращает nil, если не было произведено никаких изменений.

Обход хэша

В классе Hash имеется стандартный итератор each, а кроме него итераторы each_key, each_pair и each_value (each_pair — синоним each).

{"а"=>3, "b"=>2}.each do |key, val|

print val, " из ", key, "; " # 3 из a; 2 из b;

end

Остальные два итератора передают в блок только ключ или только значение:

{"а"=>3,"b"=>2}.each_key do |key|

print "ключ = #{key};" # Печатается: ключ = a; key = b;

end

 

{"a"=>3,"b"=>2).each_value do |value|

print "значение = #{value};" # Печатается: значение = 3; val = 2;

end





sdamzavas.net - 2020 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...