2

Ruby が返す値の順序はHash::each_value{ |val| block }何らかの形で定義されていますか? つまり、特定のハッシュの場合、ループの反復における値の順序は常に*同じですか?

配列の値とは異なり、ハッシュのキーと値のペアはソートされていないため、そうなのだろうか。

次の例を考えます。

myhash = { :a => 100, :b => 200, :z => 9, :e => 101 }
myhash.each_value { |val|
  puts val
}

Rubyは常に*印刷を保証しますか

100
200
9
101

定義されている場合のボーナス質問:
注文が定義される前提条件は何ですか? 例としてハードコーディングされたハッシュにのみ適用されますか?


[*]: 「常に」は、「各実行時、および Ruby 1.9+ が動作しているシステムでは」として読み取られる必要があります。

4

2 に答える 2

6

Ruby 1.8 では、ハッシュは順序付けされておらず、値は依存できない任意の順序で返されます。Ruby 1.9 では、ハッシュはキーが挿入された時間に基づいて順序付けられます (最初の挿入が最初に配置されるなど)。

脚注で、「「常に」は「各実行時、および Ruby 1.9+ が動作しているシステムでは」と読む必要がある」と指定しました。その「常に」の定義により、答えは「はい」です ;)

Ruby 1.8.7ハッシュドキュメントから:

キーまたは値のいずれかでハッシュをトラバースする順序は、恣意的なように見える場合があり、通常は挿入順序にはなりません。

Ruby 1.9.3ハッシュドキュメントから:

ハッシュは、対応するキーが挿入された順序で値を列挙します。

于 2012-06-14T16:44:25.190 に答える
3

Ruby 1.9 では、順序は挿入順です。

これがニュースだった〜3年前の情報:

于 2012-06-14T16:43:32.623 に答える