是否定义了Ruby哈希的each_value的顺序?

Tor*_*örn 2 ruby associative-array

Ruby的返回值的顺序是以Hash::each_value{ |val| block }某种方式定义的吗?即对于给定的哈希值,循环迭代中的值的顺序总是*相同?

我想知道是不是这样,因为哈希的键值对不像数组的值那样排序.

给出以下示例:

myhash = { :a => 100, :b => 200, :z => 9, :e => 101 }
myhash.each_value { |val|
  puts val
}
Run Code Online (Sandbox Code Playgroud)

Ruby确保它始终*打印

100
200
9
101
Run Code Online (Sandbox Code Playgroud)

如果定义了奖金问题:
订单定义的先决条件是什么?它仅适用于硬编码哈希作为示例吗?


[*]:" always "应该被理解为' 每次执行时以及任何具有Ruby 1.9+工作的系统 '.

Ben*_*Lee 6

在Ruby 1.8中,没有对Hashes进行排序,并且将以您不能依赖的任意顺序返回值.在Ruby 1.9中,基于插入键的时间(先插入第一个插入等等)来排序哈希值.

您在脚注中指定"'始终'应该在每次执行时以及在具有可用Ruby 1.9+的任何系统上读取'.".根据"总是"的定义,答案是"是";)

来自Ruby 1.8.7 Hash文档:

通过键或值遍历散列的顺序可能看起来是任意的,通常不会按插入顺序排列.

来自Ruby 1.9.3 Hash文档:

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