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

时间:2012-06-14 16:41:43

标签: ruby associative-array

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 + 的系统上读作“”。

2 个答案:

答案 0 :(得分:6)

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

您在脚注中指出,“'always'应该在每次执行时和在任何具有Ruby 1.9+工作的系统上读作'。”。根据“总是”的定义,答案是“是”;)

来自Ruby 1.8.7 Hash文档:

  

您可以看到按键或值遍历散列的顺序   任意的,通常不会在插入顺序中。

来自Ruby 1.9.3 Hash文档:

  

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

答案 1 :(得分:3)

在Ruby 1.9中,顺序是插入顺序。

大约三年前这个消息时的一些信息: