%w(a b c).inject(:+)
# => "abc"
%w(a b c).sum
# => TypeError: String can't be coerced into Integer
另外,
(1..1000000000).sum
# => 500000000500000000 (execution time: less than 1s)
(1..1000000000).inject(:+)
# => 500000000500000000 (execution time: upwards of a minute)
# http://madeofcode.com/posts/74-ruby-core-extension-array-sum
class Array
def sum(method = nil, &block)
if block_given?
raise ArgumentError, "You cannot pass a block and a method!" if method
inject(0) { |sum, i| sum + yield(i) }
elsif method
inject(0) { |sum, i| sum + i.send(method) }
else
inject(0) { |sum, i| sum + i }
end
end
end
16条答案
按热度按时间zzwlnbp81#
对于ruby>=2.4,可以使用sum:
array.sum
对于ruby<2.4,可以使用inject:
注:需要
0
基本情况,否则将在空数组上返回nil
:bd1hkmkf2#
试试这个:
请参见Ruby的可枚举文档
(注:需要
0
基本用例,以便在空数组上返回0
,而不是nil
)r9f1avp53#
虽然相当于
array.inject(0, :+)
,但随着MapReduce programming models的增加,术语REDUTE进入了一个更常见的白话。注入、减少、折叠、累积、压缩都是folding functions的同义词。我发现跨代码库的一致性是最重要的,但由于不同的社区倾向于偏爱一个词而不是另一个词,因此了解替代方案是很有用的。
为了强调map-Reduced的措辞,这里有一个版本,它对该数组中结束的内容更宽容一些。
一些其他相关阅读材料:
e5nqia274#
或者(仅供比较),如果您安装了Rails(实际上只是ActiveSupport):
f1tvaqid5#
对于Ruby>=2.4.0,您可以使用Enumerables中的
sum
。Mokeypatch基类是危险的。如果您喜欢Danger并使用旧版本的Ruby,可以将
#sum
添加到Array
类中:pcww981p6#
Ruby 2.4.0新增功能
您可以使用命名恰当的方法
Enumerable#sum
。与inject(:+)
相比,它有很多优点,但在结尾处也有一些重要的注解需要阅读。示例
射程
数组
重要说明
此方法不等同于
#inject(:+)
。例如另外,
有关
sum
为什么是这样的更多信息,请参见this answer。9rbhqvlz7#
Ruby 2.4+/rails-
array.sum
即[1, 2, 3].sum # => 6
Ruby Pre 2.4-
array.inject(:+)
或array.reduce(:+)
#sum
方法是对enumerable
的2.4的新添加,因此您现在可以在纯Ruby中使用array.sum
,而不仅仅是rails。5us2dqdw8#
出于多样性考虑,如果您的数组不是数字数组,而是具有数字属性(例如,数量)的对象数组,也可以这样做:
uwopmtnx9#
Ruby 1.8.7方式如下:
kcwpcxri10#
Ruby 2.4.0发布了,它有一个可枚举的#sum方法。所以你可以这样做
文档中的示例:
ffscu2ro11#
对于零值的数组,我们可以进行压缩,然后注入总和ex-
xjreopfe12#
还允许
[1,2].sum{|x| x * 2 } == 6
:9udxz4iz13#
方法一:
方法二:
方法三:
**方法4:**当数组包含nil和空值时,默认情况下,如果使用上述函数中的任何一个,则将通过
TypeError:不能将Nil强制为整数
你可以通过以下方式克服这个问题,
*方法六:评估
计算字符串中的Ruby表达式。
nr9pn0ug14#
如果你觉得高尔夫球,你可以做
这将创建一个字符串“123+321+12389”,然后使用函数EVERA进行求和。这是仅用于高尔夫球,您不应该在正确的代码中使用它。
v6ylcynt15#
你也可以用一种简单的方法来做