Czy można uzyskać dostęp do indeksu w Hash każdej pętli?

119

Prawdopodobnie brakuje mi czegoś oczywistego, ale czy istnieje sposób, aby uzyskać dostęp do indeksu / liczby iteracji wewnątrz każdej pętli mieszania?

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)?
}
Upgradingdave
źródło
3
Anon: Nie, skróty nie są sortowane.
Mikael S
skróty nie są technicznie sortowane, ale w ruby ​​można je w pewnym sensie sortować. sort () skonwertuje je na posortowaną zagnieżdżoną tablicę, którą możesz następnie przekonwertować z powrotem na hash: your_hash.sort.to_h
jlesse

Odpowiedzi:

296

Jeśli chcesz poznać indeks każdej iteracji, możesz użyć .each_with_index

hash.each_with_index { |(key,value),index| ... }
TY
źródło
24
konkretnie:hash.each_with_index { |(key,value),index| ... }
rampion
22
pareny są konieczne b / c hash.eachdaje każdą parę klucz-wartość w pliku Array. Pareny robią to samo, co (key,value) = arrumieszczanie pierwszej wartości (klucza) w key, a drugiej w value.
rampion
1
Dzięki @ S.Mark, @rampion, zadziałało. Nie each_with_indexznalazłem listy w RDoc for Hash: ruby-doc.org/core/classes/Hash.html . Teraz widzę, że jest członkiem Enumerable. Ale szkoda, że nie mogę rdoc Odsyłacze each_with_indexod Hash.html.
Upgradingdave
2
@Dave_Paroulek Często marzyłem o tym samym. Zauważyłem, że ręczne sprawdzenie modułów nadrzędnych jest koniecznym krokiem podczas używania vi do sprawdzania metod klas. Często po prostu skaczę irbi używam, ClassName#instance_methodsaby upewnić się, że niczego nie przegapiłem.
rampion
Dzięki, @rampion, ClassName#instance_methodsbył bardzo pomocny
Upgradingdave
11

Możesz iterować po klawiszach i ręcznie uzyskać wartości:

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

EDYCJA: zgodnie z komentarzem rampion, właśnie dowiedziałem się, że możesz uzyskać zarówno klucz, jak i wartość jako krotkę, jeśli iterujesz 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
Kaleb Brasee
źródło
Obniżony za dostęp do iterowanej kolekcji z wnętrza pętli i błędnego kodu: keyw pierwszej pętli znajduje się tablica pary klucz + wartość, więc używanie jej jako indeksu w hashjest błędne. Czy kiedykolwiek to przetestowałeś?
SasQ