Чтение онлайн

на главную - закладки

Жанры

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

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

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

Поделиться:
Популярные книги

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Я царь. Книга XXVIII

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Искатель 9

Шиленко Сергей
9. Валинор
Фантастика:
рпг
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Искатель 9

Личный аптекарь императора. Том 4

Карелин Сергей Витальевич
4. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 4

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга III

Патриот. Смута

Колдаев Евгений Андреевич
1. Патриот. Смута
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Патриот. Смута

Искатель 4

Шиленко Сергей
4. Валинор
Фантастика:
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Искатель 4

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Барон запрещает правила

Ренгач Евгений
9. Закон сильного
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Барон запрещает правила

Я еще граф. Книга #8

Дрейк Сириус
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Я еще граф. Книга #8