Можливий доступ до індексу в кожному циклі Hash?


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
Анон: Ні, хеши не сортуються.
Mikael S

хеші не відсортовані технічно, але в рубінах ви можете їх сортувати за певним сенсом. sort () перетворить їх у відсортований вкладений масив, який ви потім зможете перетворити назад у хеш: your_hash.sort.to_h
jlesse

Відповіді:


296

Якщо ви хочете знати індекс кожної ітерації, яку ви могли б використовувати .each_with_index

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

24
конкретно:hash.each_with_index { |(key,value),index| ... }
чемпіон

22
необхідні паролі b / c hash.eachдає кожній парі ключ-значення в an Array. Парени роблять те саме, що (key,value) = arr, вводячи перше значення (ключ) key, а друге - value.
чемпіон

1
Дякую @ S.Mark, @rampion, що спрацювало. Я не бачив each_with_indexперелічених у RDoc для Hash: ruby-doc.org/core/classes/Hash.html . Тепер я бачу, що він є членом Unumerable. Але шкода, що RDoc не може перехрестити посилання each_with_indexз Hash.html.
Upgradingdave

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

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

Запропонований доступ до ітераційної колекції зсередини циклу та помилкового коду: keyу першому циклі знаходиться масив пари ключ + значення, тому використовувати його як індекс у hashпомилково. Ви коли-небудь тестували його?
SasQ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.