2011-11-04 8 views
11

Al llamar each en un hash de rubí, se puede obtener la clave y el valor muy bien separado de esta manera:¿Es posible separar la clave de salida y el valor de un hash al usar Inject?

{ :a => 1, :b => 2, :c => 3 }.each do |key, value| 
    puts "key is #{key} and value is #{value}" 
end 

========================= 

key is :a and value is 1 
key is :b and value is 2 
key is :c and value is 3 
=> {:a=>1, :b=>2, :c=>3} 

Sin embargo, esto no parece funcionar cuando se utiliza inject.

{ :a => 1, :b => 2, :c => 3 }.inject(0) do |result, key, value| 
    puts "key is #{key} and value is #{value}" 
    result + value 
end 

========================= 

key is [:a, 1] and value is 
TypeError: nil can't be coerced into Fixnum 

En el ejemplo simplificado anterior Realmente no necesito las llaves, así que sólo podía llamar hash.values.inject, pero asumiendo que necesito tanto, hay una manera más limpia de hacer esto que este horrible bodge?

{ :a => 1, :b => 2, :c => 3 }.inject(0) do |result, key_and_value| 
    puts "key is #{key_and_value[0]} and value is #{key_and_value[1]}" 
    result + key_and_value[1] 
end 

Respuesta

21

Parece que necesita:

{ :a => 1, :b => 2, :c => 3 }.inject(0) do |result, (key, value)| 
    puts "key is #{key} and value is #{value}" 
    result + value 
end 
+0

Gracias! Nuevo para Ruby y esto me ha irritado ya que su fealdad contrasta con el resto del lenguaje. Sabía que habría una solución simple y simple como esta. – Russell

+1

+1 porque esta fue una buena respuesta, y me hubiera irritado estar atascado en 299 reputación ... – Russell

Cuestiones relacionadas