在ruby中,为什么在插入顺序中保证哈希的同时设置无序?

时间:2018-07-01 13:11:07

标签: ruby

Hash in ruby 2.5.1

  

哈希按插入相应键的顺序枚举其值。

Set in ruby 2.5.1

  

Set实现了无序值的集合,没有重复项。

我认为集合是作为红宝石中的哈希实现的。那么为什么在插入顺序中保证哈希的情况下设置无序?

更新:

我知道数学上的集合应该是无序的。

一个重要的问题出现了,即使Set类实际上是按插入顺序排列的,也没有记录在案。我认为文档应该更新。

即使在Set#add源中,我们也可以看到它实际上正在使用Hash

# File set.rb, line 348

def add(o)
  @hash[o] = true
  self
end

注意:我并不是要引起讨论,但认为将这一事实记录在某处很重要。如果不在官方文档中,则至少会出现堆栈溢出。

1 个答案:

答案 0 :(得分:1)

集合 是无序的;合规的实现可以将其构建在实际上无序的内核之上。 (例如,我不确定JRuby会做什么,尽管我想他们可能使用与CRuby相同的基于Hash的实现。)

您注意到,实际上Set是使用Hash实现的-这意味着它实际上将保留插入顺序...只是规范不保证。

如果您要问为什么这样定义 ,那么文档很可能早于保证哈希排序并且从未修改过(同样有可能这是有意识的选择)。它是最近在https://bugs.ruby-lang.org/issues/14069中提出的,但到目前为止还没有讨论。