2011-11-04 24 views
11

Khi gọi each trên băm trong ruby, bạn có thể nhận chìa khóa và giá trị độc đáo tách ra như thế này:Có thể tách khóa và giá trị của băm khi sử dụng bơm không?

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

Tuy nhiên điều này dường như không làm việc khi sử dụng 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 

Trong ví dụ đơn giản ở trên tôi không thực sự cần các phím vì vậy tôi chỉ có thể gọi hash.values.inject, nhưng giả sử tôi cần cả hai, là có một cách sạch hơn để làm điều này hơn bodge khủng khiếp này?

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

Trả lời

21

Có vẻ như bạn cần:

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

Cảm ơn! Mới với Ruby và điều này đã làm tôi khó chịu vì sự xấu xa của nó hoàn toàn trái ngược với phần còn lại của ngôn ngữ. Tôi biết sẽ có một giải pháp đơn giản sạch sẽ như thế này. – Russell

+1

+1 vì đây là một câu trả lời hay, và nó sẽ làm tôi khó chịu khi bị kẹt ở 299 danh tiếng ... – Russell

Các vấn đề liên quan