可能在哈希循环中访问索引吗?


119

我可能缺少明显的东西,但是有没有办法在每个循环的哈希内访问迭代的索引/计数?

hash = {'three' => 'one', 'four' => 'two', 'one' => 'three'}
hash.each { |key, value| 
    # any way to know which iteration this is
    #   (without having to create a count variable)?
}

3
Anon:不,哈希没有排序。
Mikael S 2010年

从技术上讲,哈希不是经过排序的,但是在红宝石中,您可以在某种意义上对其进行排序。sort()会将它们转换为排序的嵌套数组,然后您可以将其转换回哈希:your_hash.sort.to_h
jlesse

Answers:


296

如果您想知道每次迭代的索引,可以使用 .each_with_index

hash.each_with_index { |(key,value),index| ... }

24
特别是:hash.each_with_index { |(key,value),index| ... }
风铃草

22
括号是必需的b / c hash.each给出内的每个键值对Array。括号的作用与(key,value) = arr将第一个值(键)放入key,然后将第二个值放入中相同value
风铃草

1
谢谢@ S.Mark,@ rampion,它起作用了。我没有each_with_index在RDoc for Hash中看到列出的代码:ruby-doc.org/core/classes/Hash.html。现在我看到它是Enumerable的成员。但是太糟糕了,RDoc无法each_with_index从Hash.html中交叉引用。
Upgradingdave 2010年

2
@Dave_Paroulek我经常希望如此。我发现使用vi来检查类的方法时,手动检查父模块是必要的步骤。通常,我只是跳到irb,并使用ClassName#instance_methods来确保没有错过任何内容。
风铃草

THX,@rampion,ClassName#instance_methods非常有帮助
Upgradingdave

11

您可以遍历键,然后手动获取值:

hash.keys.each_with_index do |key, index|
   value = hash[key]
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

编辑:根据rampion的评论,我还刚刚了解到,如果迭代遍历,则可以将元组的键和值都获得hash

hash.each_with_index do |(key, value), index|
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

为从循环内部访问迭代的集合以及错误的代码而之以鼻:key在第一个循环中,是键值对的数组,因此将其用作in的索引hash是错误的。你有没有测试过?
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.