Такой структуры нет в Ruby.
Обратите внимание, что Hash#rassoc
делает что-то похожее, но возвращает только первое совпадение и имеет линейное время:
h = {:abc => 123, :xyz => 789, :qaz => 789, :wsx => [888, 999]}
h.rassoc(123) # => [:abc, 123]
Кроме того, невозможно полностью удовлетворить ваши требования в Ruby, поскольку вы не сможете обнаружить изменения значений, которые являются массивами. E.g.:
h = MyBidirectionalArray.new(:foo => 42, :bar => [:hello, :world])
h.rfetch(:world) # => :bar
h[:bar].shift
h[:bar] # => [:world]
h.rfetch(:world) # => should be nil, but how to detect this??
Вычисление хеша каждый раз, чтобы обнаружить изменение, сделает ваш поиск линейным по времени. Вы можете дублировать значения массива и заморозить их, хотя (как это делает Ruby для ключей Hash, которые являются строками!)
Вам нужен класс Graph, API которого может отличаться от Hash
, нет? Вы можете проверить rgl или аналогичный, но я не знаю, как они реализованы.
Удачи.