2011-11-04 38 views
11

當調用在紅寶石哈希each,你可以得到鍵和值很好地分離這樣的:使用注入時可能分離出散列的鍵和值?

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

然而,這似乎並沒有使用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 

在簡化上述例子我並不真正需要的鑰匙,所以我可以只調用hash.values.inject,但假設我兩者都需要,是有一個更清潔的方式來做到這一點比這可怕的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 

回答

21

它看起來像你需要:

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

謝謝!對於Ruby來說,這是一個令人惱火的問題,因爲它的醜陋與其他語言形成了鮮明的對比。我知道會有這樣簡單的解決方案。 – Russell

+1

+1因爲這是一個很好的答案,並且它會激怒我被卡在299的名聲...... – Russell