2011-11-04 10 views
11

Dzwoniąc each na hash w Ruby, można uzyskać klucz i wartość ładnie oddzielone tak:Możliwe oddzielenie klucza i wartości hasha przy korzystaniu z iniekcji?

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

Jednak nie wydaje się, aby pracować przy użyciu 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 

W uproszczonym przykładzie powyżej naprawdę nie potrzebują kluczy, więc może po prostu zadzwoń hash.values.inject, ale przy założeniu, że muszę jak jest tam czystsze sposób to zrobić niż ten okropny 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 

Odpowiedz

21

Wygląda na to, czego potrzebujesz:

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

Dzięki! Nowość w Ruby i to mnie irytuje, ponieważ jej brzydota kontrastuje z resztą języka. Wiedziałem, że będzie takie proste, proste rozwiązanie. – Russell

+1

+1, ponieważ to była dobra odpowiedź, a to by mnie zirytowało, że utknąłem na 299 reputacji ... – Russell

Powiązane problemy