Mungkin untuk mengakses indeks dalam Hash setiap loop?

119

Saya mungkin melewatkan sesuatu yang jelas, tetapi adakah cara untuk mengakses indeks / hitungan iterasi di dalam hash setiap loop?

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
sumber
3
Anon: Tidak, hash tidak diurutkan.
Mikael S
hash tidak diurutkan secara teknis, tetapi di ruby ​​Anda dapat mengurutkan mereka dalam arti tertentu. sort () akan mengonversinya menjadi array bersarang yang diurutkan, yang kemudian dapat Anda ubah kembali menjadi hash: your_hash.sort.to_h
jlesse

Jawaban:

296

Jika Anda ingin mengetahui Indeks dari setiap iterasi yang dapat Anda gunakan .each_with_index

hash.each_with_index { |(key,value),index| ... }
KAMU
sumber
24
khusus:hash.each_with_index { |(key,value),index| ... }
rampion
22
tanda kurung diperlukan b / c hash.eachmemberikan setiap pasangan nilai kunci di Array. Tanda kurung melakukan hal yang sama seperti (key,value) = arr, memasukkan nilai pertama (kunci) ke dalam key, dan yang kedua ke dalam value.
rampion
1
Terima kasih @ S.Mark, @rampion, itu berhasil. Saya tidak melihat each_with_indextercantum di RDoc untuk Hash: ruby-doc.org/core/classes/Hash.html . Sekarang saya melihat bahwa itu adalah anggota Enumerable. Tapi sayang sekali RDoc tidak bisa referensi silang each_with_indexdari Hash.html.
Upgradingdave
2
@Davearoulek Saya sering menginginkan hal yang sama. Saya telah menemukan memeriksa modul induk secara manual sebagai langkah yang diperlukan saat menggunakan vi untuk memeriksa metode kelas. Seringkali saya hanya melompat ke irb, dan menggunakan ClassName#instance_methodsuntuk memastikan tidak ada yang terlewat.
rampion
Terima kasih, @rampion, ClassName#instance_methodstelah sangat membantu
Upgradingdave
11

Anda dapat mengulangi kunci, dan mendapatkan nilainya secara manual:

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: sesuai komentar rampion, saya juga baru mengetahui bahwa Anda bisa mendapatkan kunci dan nilai sebagai tupel jika Anda mengulang 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
sumber
Tidak dipilih untuk mengakses koleksi yang diiterasi dari dalam loop dan kode yang salah: keydi loop pertama adalah larik pasangan kunci + nilai, jadi menggunakannya sebagai indeks di hashsalah. Pernahkah Anda mengujinya?
SasQ