使用inject时可以分离哈希的键和值吗?

Rus*_*ell 12 ruby

each在ruby中调用hash时,你可以像这样得到键和值很好地分开:

{ :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}
Run Code Online (Sandbox Code Playgroud)

但是,这在使用时似乎不起作用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
Run Code Online (Sandbox Code Playgroud)

在上面的简化示例中,我并不真正需要按键,所以我可以打电话hash.values.inject,但假设我需要两个,是否有比这个可怕的小屋更清洁的方法呢?

{ :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
Run Code Online (Sandbox Code Playgroud)

小智 21

看起来你需要:

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

  • +1 因为这是一个很好的答案,如果我被困在 299 名声中会激怒我...... (2认同)