我有一个哈希数组,每个哈希lol都有一个具有整数值的键.我想总结值,注入总是工作但现在我得到一个例外:
array = [{lol: 1}, {lol: 2}]
array.inject {|memo, (key, value)| memo + value} =>
NoMethodError: undefined method `+' for {:lol=>1}:Hash
from (irb):26:in `block in irb_binding'
from (irb):26:in `each'
from (irb):26:in `inject'
from (irb):26
Run Code Online (Sandbox Code Playgroud)
Por que?
您可以获取所有哈希值flat_map(&:values),然后使用inject(:+)它们求和.
[{lol: 1}, {lol: 2}].flat_map(&:values).inject(:+)
Run Code Online (Sandbox Code Playgroud)
你的方法不起作用的原因是inject将产生块的每个哈希值,而不是数组中每个哈希值的每个键/值对.如果你想保留你的解决方案,你需要这样的东西:
array.map {|hash| hash.inject(0) {|memo, (key, value)| memo + value } }.inject(:+)
Run Code Online (Sandbox Code Playgroud)
如果您没有指定 参数inject,则第一次迭代的 memo 对象的值是可枚举的第一个元素,在本例中是哈希值。因此,您只需将0其作为参数传递给inject:
array = [{lol: 1}, {lol: 2}]
array.inject(0) { |sum, h| sum + h[:lol] }
# => 3
Run Code Online (Sandbox Code Playgroud)
来自 .inject文档
如果没有显式指定memo的初始值,则集合的第一个元素将用作memo的初始值。
array.inject {|memo, (key, value)| memo + value}
Run Code Online (Sandbox Code Playgroud)
memo 的值是哈希值而不是数字。
将其更正为
array.inject(0) {|memo, hash| memo + hash[:lol]} # => 3
Run Code Online (Sandbox Code Playgroud)