Potrzebuję dwukierunkowej tabeli skrótu w języku Ruby. Na przykład:Tabela mieszania dwukierunkowego w języku 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
Method rfetch
oznacza odwrócony pobrać i jest tylko moja propozycja.
Uwaga trzy rzeczy:
- Jeśli kilka klawiszy map przy tej samej wartości następnie
rfetch
zwraca wszystkie z nich, zapakowane w tablicy. - Jeśli wartością jest tablica, wówczas
rfetch
szuka jej parametru wśród elementów tablicy. - Hash dwukierunkowy oznacza, że zarówno
fetch
, jak irfetch
powinny być wykonywane w stałym czasie.
Czy taka struktura istnieje w Ruby (w tym w bibliotekach zewnętrznych)?
Zastanowiłem się nad jego implementacją za pomocą dwóch jednokierunkowych skrótów synchronizowanych, gdy jedna z nich jest modyfikowana (i pakowana w klasę, aby uniknąć problemów z synchronizacją), ale może mógłbym użyć już istniejącego rozwiązania?
Dla szybkiego i brudnego można użyć wbudowanego 'hash.invert()', aby utworzyć oddzielny skrót odwrotny (http://stackoverflow.com/a/3794060/18706). Jak zaznacza @ ken-bloom, bardziej niezawodna implementacja tego jest na http://raa.ruby-lang.org/project/inverthash/ – mahemoff