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

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.