2015-06-29 81 views
1

对于LRU缓存,LinkedListHashMap是一个非常有用的结构。链接列表哈希红宝石

在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

红宝石1.9哈希实现最终没有下一个或背法。大多数情况下,如果你需要这样的功能,哈希将被转换为元组,键或值的数组。但是因为哈希是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

我认为我们能够删除键,那么唯一的办法重新进行添加它

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

然后:some_key将被转移到hash

+0

谢谢,我意识到这一点后! – DaynaJuliana