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

Данный текст является ознакомительным фрагментом.