2011-11-04 20 views
11

Quando si chiama each su un hash in Ruby, è possibile ottenere la chiave e il valore ben separati in questo modo:È possibile separare la chiave e il valore di un hash quando si utilizza iniettare?

{ :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} 

Tuttavia questo non sembra funzionare quando si utilizza 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 

Nell'esempio semplificato di cui sopra non ho davvero bisogno le chiavi quindi ho potuto solo chiamare hash.values.inject, ma assumendo ho bisogno di entrambi, c'è un modo più pulito per fare questo che questa orribile 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 

risposta

21

Sembra che vi serve:

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

Grazie! Nuovo per Ruby e questo mi ha irritato perché la sua bruttezza è in netto contrasto con il resto della lingua. Sapevo che ci sarebbe stata una soluzione semplice e pulita come questa. – Russell

+1

+1 perché questa era una buona risposta, e mi avrebbe irritato essere bloccato a 299 reputazione ... – Russell

Problemi correlati