哈希按插入相应键的顺序枚举其值。
Set实现了无序值的集合,没有重复项。
我认为集合是作为红宝石中的哈希实现的。那么为什么在插入顺序中保证哈希的情况下设置无序?
更新:
我知道数学上的集合应该是无序的。
一个重要的问题出现了,即使Set
类实际上是按插入顺序排列的,也没有记录在案。我认为文档应该更新。
即使在Set#add
源中,我们也可以看到它实际上正在使用Hash
:
# File set.rb, line 348
def add(o)
@hash[o] = true
self
end
注意:我并不是要引起讨论,但认为将这一事实记录在某处很重要。如果不在官方文档中,则至少会出现堆栈溢出。
答案 0 :(得分:1)
集合 是无序的;合规的实现可以将其构建在实际上无序的内核之上。 (例如,我不确定JRuby会做什么,尽管我想他们可能使用与CRuby相同的基于Hash的实现。)
您注意到,实际上Set是使用Hash实现的-这意味着它实际上将保留插入顺序...只是规范不保证。
如果您要问为什么这样定义 ,那么文档很可能早于保证哈希排序并且从未修改过(同样有可能这是有意识的选择)。它是最近在https://bugs.ruby-lang.org/issues/14069中提出的,但到目前为止还没有讨论。