2013-06-28 17 views
34

如果我迭代散列一次,然後再次這樣做,而不修改內容,密鑰是否保證以相同的順序出現?如果未修改,迭代之間是否保留哈希排序?

快速測試顯示的那麼多:

> h = {'a' => 1, 'b' => 2, 'c' => 3} 
> 100_000.times.map { h.to_s == h.to_s }.all? 
=> true 

另一個問題,如果上面的允許,我可以通過它迭代只改變值,無需添加任何新的密鑰,並有按鍵的順序是不變?

相似,這條巨蟒的問題:Do dicts preserve iteration order if they are not modified?

與所提出的重複,我不感興趣的元件是否具有完全指定的順序,只限制不經任何改動連續兩次迭代提供相同的序列。

+0

由於兩個答案都表示,插入順序被保留。這讓那些認爲「有序」意味着「排序」的人感到困惑,除非我們允許哈希類中的隱形時間戳,否則他們就不是這樣。 –

+1

[Ruby:Hash.keys和Hash.values方法返回的鍵/值的順序是什麼?](http://stackoverflow.com/questions/5208512/ruby-what-is-the-order- of-keys-values-by-hash-keys-and-hash-values-met) –

回答

64

在1.9之前,枚舉哈希的行爲不在ruby規範中,因此需要實現 - 基本上,哈希列舉行爲/模式未被語言定義,並且實現可以真正做到他們想做的任何事情(隨機?排序?插入順序?每次都有不同的方法?什麼都行!)

1.9+,哈希枚舉由語言指定爲插入順序,所以如果您知道您的平臺是1.9+,那麼您可以依賴它。

RubySpec

+5

ruby​​ 2.2.0+不再跟隨rubyspec,請參閱http://rubini.us/2014/12/31/ matz-s-ruby-developers-don-t-use-rubyspec/ – johnlinvc

+0

在超過一千次提交之後,rubyspec重新煥發活力http://eregon.github.io/rubyspec/2015/07/29/rubyspec-is -reborn.html – nurettin