有没有办法用索引值遍历散列?

Is there a way to iterate through a hash with index values?

我正在编写一个程序来“纠正”我拥有的当前哈希值。我有一个散列,它的键值对是 "off" 乘以一个。这是不正确的散列:

wrong_hash = {:a => "banana", :b => "cabbage", :c => "dental_floss", :d => "eel_sushi”}

:c需要与“卷心菜”配对, :b 需要与“香蕉”配对 等等

这就是我目前所拥有的。我在创建变量 new_item

时遇到问题
def hash_correct(hash)
 correct_hash = {}

 hash.each do |key, item|
 new_item = 
  correct_hash << hash[key] = new_item
end

return correct_hash

end

注意:我的兴趣不是仅仅获得正确答案,而且我知道还有其他方法可以解决这个问题(排序、while 循环等)我只是想知道是否有办法在我的块中包含一个索引变量。类似于 |key, item, index|

我是新手,非常感谢任何帮助!

each_cons很适合这个:

wrong_hash = {:a => "banana", :b => "cabbage", :c => "dental_floss", :d => "eel_sushi"}

right_hash = {}
wrong_hash.each_cons(2){|(_, v1),(k2, _)| right_hash[k2] = v1}
p right_hash # => {:b=>"banana", :c=>"cabbage", :d=>"dental_floss"}

Enumerable#each_with_index 方法,对于散列可以这样使用:

hash.each_with_index { |(k, v), i| ... }

但是,您可以使用

解决您的特定问题
wrong_hash.keys.drop(1).zip(wrong_hash.values).to_h
# => {:b=>"banana", :c=>"cabbage", :d=>"dental_floss"}
values = wrong_hash.values.unshift(nil)
  #=> [nil, "banana", "cabbage", "dental_floss", "eel_sushi"] 
wrong_hash.merge(wrong_hash) { values.shift }
  #=> {:a=>nil, :b=>"banana", :c=>"cabbage", :d=>"dental_floss"} 

这使用 Hash#merge 的形式,它使用一个块 ({ values.shift }) 来确定被合并的两个哈希共享的每个键的值,这里是所有键。