2010-01-18 5 views
103

Prawdopodobnie brakuje mi czegoś oczywistego, ale czy istnieje sposób na uzyskanie dostępu do indeksu/liczby iteracji w haszy w każdej pętli?Czy można uzyskać dostęp do indeksu w Hashu w każdej pętli?

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

Czy hashe zostały posortowane? –

+3

Anon: Nie, hasze nie są sortowane. –

Odpowiedz

245

Jeśli chcesz wiedzieć indeks każdej iteracji można użyć .each_with_index

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

w szczególności: 'hash.each_with_index {| (key, value), index | ...} ' – rampion

+18

potrzebne są pareny b/c' hash.each' daje każdej pary klucz-wartość w 'Tablicy'. Pareny robią to samo, co '(key, value) = arr', umieszczając pierwszą wartość (klucz) w' key', a drugą na 'value'. – rampion

+0

Dzięki za kontynuację – YOU

10

Można iteracyjne nad klucze i uzyskać wartości ręcznie:

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: na komentarz zerwa za, ja też właśnie dowiedział się można dostać zarówno klucz i wartość w postaci krotka jeśli iteracyjne nad 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

Rewizja za dostęp do kolekcji iterowanej z pętli i błędny kod: 'klucz' w pierwszej pętli jest tablicą pary klucz + wartość, więc użycie jej jako indeksu w' hash' jest niepoprawne. Czy kiedykolwiek testowałeś to? – SasQ

Powiązane problemy