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

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

Удалить пары ключ-значение из хэша можно с помощью методов 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, если не было произведено никаких изменений.

8.2.5. Обход хэша

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

8.2.6. Инвертирование хэша

Инвертирование хэша осуществляется в Ruby тривиально с помощью метода invert:

а = {'fred'=>'555-1122','jane'=>'555-7779'}

b = a.invert

b['555-7779'] # 'jane'

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

8.2.7. Поиск ключей и значений в хэше

Определить, было ли присвоено значение некоторому ключу, позволяет метод has_key? или любой из его синонимов include?, key?, member? :

а = {'а'=>1,'b'=>2}

a.has_key? 'с' # false

a.include? 'а' # true

a.key? 2       # false

a.member? 'b'  # true

Можно также воспользоваться методом empty?, чтобы узнать, остался ли в хэше хотя бы один ключ. А метод length и его синоним size позволяют узнать, сколько ключей имеется в хэше:

a.empty? # false

a.length # 2

Можно проверить также, существует ли указанное значение. Для этого предназначены методы has_value? или value?:

a.has_value? 2 # true

a.value? 99    # false

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату