2010-01-18 21 views
103

Probablemente me falta algo obvio, pero ¿hay alguna manera de acceder al índice/recuento de la iteración dentro de un hash en cada ciclo?¿Es posible acceder al índice en un Hash cada ciclo?

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

¿Están los hashes ordenados? –

+3

Anon: No, los hashes no están ordenados. –

Respuesta

245

Si le gustaría saber Índice de cada iteración se puede utilizar .each_with_index

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

específicamente: 'hash.each_with_index {| (clave, valor), índice | ...} ' – rampion

+18

los parens son necesarios b/c' hash.each' da cada par clave-valor en una 'Matriz'. Los parens hacen lo mismo que '(clave, valor) = arr', poniendo el primer valor (la clave) en' clave', y el segundo en 'valor'. – rampion

+0

Gracias por seguimiento rampion – YOU

10

Se podría iterar sobre las claves, y obtener los valores de forma 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: por el comentario de rampion, también acaba de enterarse de que puede obtener la clave y valor como tupla si iterar sobre 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

Downvoted para acceder a la colección iterada desde el interior del bucle y un código erróneo: 'key' en el primer bucle es una matriz de pares clave + valor, por lo que usarlo como índice en' hash' es incorrecto. ¿Alguna vez lo has probado? – SasQ

Cuestiones relacionadas