Мне нужна двунаправленная хэш-таблица в Ruby. Например:
h = {:abc => 123, :xyz => 789, :qaz => 789, :wsx => [888, 999]}
h.fetch(:xyz) # => 789
h.rfetch(123) # => abc
h.rfetch(789) # => [:xyz, :qaz]
h.rfetch(888) # => :wsx
Метод rfetch
означает обратную выборку и является только моим предложением.
Обратите внимание на три вещи:
- Если несколько ключей сопоставляются с одним и тем же значением, тогда
rfetch
возвращает их все, упакованные в массив. - Если значение является массивом, то
rfetch
ищет его параметр среди элементов массива. - Двунаправленный хеш означает, что и
fetch
, иrfetch
должны выполняться за постоянное время.
Существует ли такая структура в Ruby (включая внешние библиотеки)?
Я думал реализовать его с помощью двух однонаправленных хэшей, синхронизированных при изменении одного из них (и упаковать его в класс, чтобы избежать проблем с синхронизацией), но, может быть, я мог бы использовать уже существующее решение?
v.dup
вместоv
вfetch_from
, иначе вы можете получить неприятные побочные эффекты, например.b.rfetch(:a).pop
05.08.2011