Ruby中有序哈希表的用途是什么?

3

我最近开始学习 Ruby 和哈希表。一开始我知道哈希表是无序的,这很容易理解,但现在我发现在较新的版本中哈希表是有序的。我并不真正理解为什么会这样或这背后的概念。

能否给我一些关于有序哈希表用途方面的见解呢?普通哈希表和有序哈希表之间的使用情况也可以提供。


3
有时候插入顺序很重要,它基本上是一个自动队列,但还带有关键字查找功能。使用情况的差异显而易见,就是“在插入顺序很重要时”。然而需要注意的是,这可能并不是为了某个目的,而只是实现细节。 - Dave Newton
1
重要的是要知道很多语言都提供了这个功能,但是我认为你不应该依赖它,特别是当你的代码将在旧版本的Ruby上运行或者将被移植到其他语言上运行时。编写相同的行为很容易。 - the Tin Man
1
为什么数组的顺序很重要?你所说的“常规哈希”是什么意思? - sawa
插入顺序在1.9中得到实现,实际上似乎改善了哈希表的插入和访问操作性能。我说似乎是因为1.9解释器比1.8.7更快,所以很难确定这有多少归功于有序哈希表,多少直接归功于解释器本身。 - engineersmnky
3个回答

4
有些人喜欢使用有序哈希(ordered-hash),因为它记住了键值对插入的顺序。这允许程序员将哈希表用作类似队列的数据结构,并随机访问与键相关联的值。如果他们想要在运行时更改值,然后再以插入顺序迭代队列的键/值对来检索它们,这将非常有用。
此外,与其像使用基于数组的队列一样提供索引,他们可以提供一个符号名称。
而不是写成这样:
queue[0]

他们可以使用以下内容:
queue[:fred]

我唯一能看到有序哈希的使用场景是:可以用保持插入顺序的键队列轻松地复制其功能。


3

回顾Matz之前的一些帖子,他对为什么要实现它非常含糊。请参阅https://www.ruby-forum.com/topic/166075

他基本上表示,它是为了适应某些边缘情况而实现的,但他似乎没有更详细地阐述。他还表示,性能没有影响,只有内存消耗略微增加。


6
在那个帖子的第一条评论中,Matz明确表示这样做是为了简化处理2.0关键字参数。想象一下:def f a: 42, **args 被调用为 f(x: true, a: 0, y: false)Enumerator 得到了 peek 和其他方法,Hash 只是继承了这种行为。 - Aleksei Matiushkin

0
想象一下,由 Ruby Git 包装器处理的 Git 提交。它们很可能是 Hash 的实例,其中 sha 是键。通过按 Date 排序,使它们易于以人类友好的方式进行迭代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接