Her döngüde bir Hash'teki dizine erişmek mümkün mü?


119

Muhtemelen bariz bir şeyi kaçırıyorum, ancak her döngüde bir karma içindeki yinelemenin dizinine / sayısına erişmenin bir yolu var mı?

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: Hayır, karmalar sıralanmamış.
Mikael S

hash'ler teknik olarak sıralanmaz, ancak Ruby'de onları bir anlamda sıralayabilirsiniz. sort () onları sıralı bir iç içe diziye dönüştürür, ardından bunu bir hash'e dönüştürebilirsiniz: your_hash.sort.to_h
jlesse

Yanıtlar:


296

Her bir yinelemenin Dizinini bilmek isterseniz, kullanabileceğiniz .each_with_index

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

24
özellikle:hash.each_with_index { |(key,value),index| ... }
rampion

22
parenler gereklidir. b / c hash.each, her bir anahtar / değer çiftini bir Array. Parenler (key,value) = arr, ilk değeri (anahtar) içine keyve ikincisini içine koymakla aynı şeyi yapar value.
rampion

1
Teşekkürler @ S.Mark, @rampion, işe yaradı. each_with_indexHash için RDoc'da listelendiğini görmedim : ruby-doc.org/core/classes/Hash.html . Şimdi Enumerable'ın bir üyesi olduğunu görüyorum. Ancak each_with_indexRDoc'un Hash.html'den çapraz referans alamaması çok kötü .
Upgradingdave

2
@Dave_Paroulek Ben de aynı şeyi diledim. Bir sınıfın yöntemlerini kontrol etmek için vi kullanırken üst modülleri manuel olarak kontrol etmeyi gerekli bir adım buldum. Çoğunlukla atlıyorum irbve ClassName#instance_methodskaçırdığım hiçbir şey olmadığından emin olmak için kullanıyorum .
rampa

Thx, @rampion, ClassName#instance_methodsçok yardımcı oldu
Upgradingdave

11

Anahtarlar üzerinde yineleyebilir ve değerleri manuel olarak alabilirsiniz:

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

DÜZENLEME: rampionun yorumuna göre, aynı zamanda tekrarlarsanız hem anahtarı hem de değeri bir demet olarak alabileceğinizi öğrendim 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

Yinelenen koleksiyona döngünün içinden ve hatalı bir koda erişmek için olumsuz oy verildi: keyilk döngüde bir anahtar + değer çifti dizisi var, bu nedenle onu bir dizin olarak kullanmak hashyanlış. Hiç test ettin mi?
SasQ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.