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

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| ... }

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.