2010-01-18 1 views
103

У меня, вероятно, отсутствует что-то очевидное, но есть ли способ получить доступ к индексу/счету итерации внутри хэша в каждом цикле?Можно ли получить доступ к индексу в Хэш каждом цикле?

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)? 
} 
+0

Хеши отсортированы? –

+3

Anon: Нет, хеши не отсортированы. –

ответ

245

Если вы хотите узнать индекс каждой итерации можно использовать .each_with_index

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

: hash.each_with_index {| (ключ, значение), индекс | ...} ' – rampion

+18

нужны парнесы. B/c' hash.each' дает каждую пару «ключ-значение» в «Массив». Параны выполняют то же самое, что и «(ключ, значение) = arr', помещая первое значение (ключ) в« ключ », а второе - в« значение ». – rampion

+0

Спасибо за продолжение rampion – YOU

10

Вы можете перебрать ключи и получить значения вручную:

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 

EDIT: на комментарий Рэмпион, я также только что узнал, вы можете получить ключ и значение как кортеж, если перебрать 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 
+0

Downvoted для доступа к итерированной коллекции из цикла и ошибочного кода: 'key' в первом цикле представляет собой массив пары ключей + значение, поэтому использование его в качестве индекса в' hash' неверно. Вы когда-нибудь проверяли это? – SasQ

 Смежные вопросы

  • Нет связанных вопросов^_^