Книга: Программирование на языке Ruby

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

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

В классе 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

Оглавление книги


Генерация: 2.625. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз