2

我有一个散列数组,每个散列都有一个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

猪肉?

4

3 回答 3

5

来自 .inject文档

如果没有显式指定 memo 的初始值,则 collection 的第一个元素用作 memo 的初始值。

array.inject {|memo, (key, value)| memo + value}

memo 的值是散列而不是数字。

更正为

array.inject(0) {|memo, hash| memo + hash[:lol]} # => 3
于 2013-07-17T09:34:48.953 回答
5

您可以使用 获取所有哈希值flat_map(&:values),然后将inject(:+)它们相加。

[{lol: 1}, {lol: 2}].flat_map(&:values).inject(:+)

您的方法不起作用的原因是注入将产生每个散列到块,而不是数组中每个散列的每个键/值对。如果你想保留你的解决方案,你会想要这样的:

array.map {|hash| hash.inject(0) {|memo, (key, value)| memo + value } }.inject(:+)
于 2013-07-17T09:24:05.490 回答
4

如果您没有为 指定参数inject,则第一次迭代的 memo 对象的值是可枚举的第一个元素,在这种情况下是哈希。所以你只需要0作为参数传递给inject

array = [{lol: 1}, {lol: 2}]
array.inject(0) { |sum, h| sum + h[:lol] }
# => 3
于 2013-07-17T09:31:22.737 回答