如果没有修改,在迭代之间保留哈希顺序?

Rya*_*ing 34 ruby hash

如果我迭代一次哈希,然后在不修改内容的情况下再次执行,键是否保证以相同的顺序出现?

快速测试表明:

> h = {'a' => 1, 'b' => 2, 'c' => 3}
> 100_000.times.map { h.to_s == h.to_s }.all?
=> true
Run Code Online (Sandbox Code Playgroud)

另一个问题,如果允许上面的话,我可以迭代它只更改值,而不添加任何新键,并且键的顺序是否保持不变?

类似于这个python问题:如果未修改,dicts是否保留迭代顺序?

与提议的副本不同,我对元素是否具有完全指定的顺序不感兴趣,只有两个连续迭代没有修改的限制提供相同的序列.

Jus*_* L. 64

在1.9之前,枚举哈希的行为不在ruby规范中,因此需要实现 - 基本上,哈希枚举行为/模式未被语言定义,并且实现可以真正做他们想做的任何事情(随机?排序?插入顺序?每次都有不同的方法?什么都行!)

1.9+,哈希枚举由语言指定为插入顺序,所以如果你知道你的平台是1.9+,你可以依赖它.

RubySpec

  • ruby 2.2.0+不再关注rubyspec,请参阅http://rubini.us/2014/12/31/matz-s-ruby-developers-don-t-use-rubyspec/ (5认同)