Möglich, in jeder Schleife in einem Hash auf den Index zuzugreifen?

119

Ich vermisse wahrscheinlich etwas Offensichtliches, aber gibt es eine Möglichkeit, auf den Index / die Anzahl der Iterationen innerhalb eines Hash jeder Schleife zuzugreifen?

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
quelle
3
Anon: Nein, Hashes werden nicht sortiert.
Mikael S
Hashes sind technisch nicht sortiert, aber in Ruby können Sie sie in gewissem Sinne sortieren. sort () konvertiert sie in ein sortiertes verschachteltes Array, das Sie dann wieder in einen Hash konvertieren können: your_hash.sort.to_h
jlesse

Antworten:

296

Wenn Sie den Index jeder Iteration kennen möchten, können Sie ihn verwenden .each_with_index

hash.each_with_index { |(key,value),index| ... }
SIE
quelle
24
speziell:hash.each_with_index { |(key,value),index| ... }
Rampion
22
Die Parens sind notwendig. b / c hash.eachgibt jedes Schlüssel-Wert-Paar in einem an Array. Die Eltern tun das Gleiche wie (key,value) = arrden ersten Wert (den Schlüssel) keyund den zweiten Wert value.
Rampion
1
Danke @ S.Mark, @rampion, das hat funktioniert. Ich habe nicht each_with_indexim RDoc für Hash aufgeführt: ruby-doc.org/core/classes/Hash.html . Jetzt sehe ich, dass es ein Mitglied von Enumerable ist. Aber schade, dass RDoc keinen Querverweis each_with_indexvon Hash.html erstellen kann.
Upgradingdave
2
@ Dave_Paroulek Ich habe mir oft das gleiche gewünscht. Ich habe festgestellt, dass das manuelle Überprüfen der übergeordneten Module ein notwendiger Schritt ist, wenn vi zum Überprüfen der Methoden einer Klasse verwendet wird. Oft gehe ich einfach zu irbund ClassName#instance_methodsstelle sicher, dass ich nichts verpasst habe.
Rampion
Thx, @rampion, ClassName#instance_methodswar sehr hilfreich
Upgradingdave
11

Sie können die Schlüssel durchlaufen und die Werte manuell abrufen:

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

BEARBEITEN : Laut Kommentar der Rampion habe ich auch gerade erfahren, dass Sie sowohl den Schlüssel als auch den Wert als Tupel erhalten können, wenn Sie Folgendes wiederholen 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
quelle
Für den Zugriff auf die iterierte Auflistung innerhalb der Schleife und einen fehlerhaften Code herabgestuft: keyIn der ersten Schleife befindet sich ein Array aus Schlüssel + Wert-Paar, daher ist die Verwendung als Index in hashfalsch. Hast du es jemals getestet?
SasQ