2015-06-29 8 views
1

Для LRU-Cache, LinkedListHashMap - очень полезная структура.Связанный список Hash Ruby

В Ruby 1.9 Хэши теперь

Ruby 1.9 internal hash entry struct 
struct st_table_entry { 
unsigned int hash; 
st_data_t key; 
st_data_t record; 
st_table_entry *next; 
st_table_entry *fore, *back; // new in Ruby 1.9 
}; 

https://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash/

Как может я могу использовать это, чтобы установить next & back свойства на запись? Это упростит доступ и добавление в список с двойной связью!

ответ

1

The реализации Hash Ruby 1.9 не имеет следующий или метод обратного , В большинстве случаев, если вам нужны такие функции, Хэш преобразуется в массив кортежей, ключей или значений. Но так как Hash enumerable вы можете использовать следующий, как показано ниже.

h = {one: 1, two: 2, three: 3} 

enum = h.to_enum 
enum.next 
enum.next 
p enum.next # [:three, 3] 
p enum.next # error `next': iteration reached an end (StopIteration) 

enum = h.to_enum.cycle 
enum.next 
enum.next 
enum.next 
p enum.next # [:one, 1] 
enum.rewind 
p enum.next # [:one, 1] 
+0

Ничего себе, это потрясающе! Я понятия не имел, что вы можете преобразовать структуру данных в перечислимую! – DaynaJuliana

1

Я думаю, что единственный способ, чтобы мы удалили ключ, а затем readd его

hash.delete(:some_key) 
hash[:some_key] = some_value 

Тогда :some_key будет сдвинут до конца hash

+0

Спасибо, я понял это после! – DaynaJuliana