我有一个整数数组。
例如:
array = [123,321,12389]
有什么好方法能求出它们的和吗?
我知道
sum = 0
array.each { |a| sum+=a }
是可行的。
我有一个整数数组。
例如:
array = [123,321,12389]
有什么好方法能求出它们的和吗?
我知道
sum = 0
array.each { |a| sum+=a }
是可行的。
当前回答
你也可以用简单的方法做这件事
def sum(numbers)
return 0 if numbers.length < 1
result = 0
numbers.each { |num| result += num }
result
end
其他回答
试试这个:
array.inject(0){ |sum, x| sum + x }
参见Ruby的可枚举文档
(注意:需要0基本情况,以便在空数组上返回0而不是nil)
方法1:
[1] pry(main)> [1,2,3,4].sum
=> 10
[2] pry(main)> [].sum
=> 0
[3] pry(main)> [1,2,3,5,nil].sum
TypeError: nil can't be coerced into Integer
方法2:
[24] pry(main)> [].inject(:+)
=> nil
[25] pry(main)> [].inject(0, :+)
=> 0
[4] pry(main)> [1,2,3,4,5].inject(0, :+)
=> 15
[5] pry(main)> [1,2,3,4,nil].inject(0, :+)
TypeError: nil can't be coerced into Integer
from (pry):5:in `+'
方法3:
[6] pry(main)> [1,2,3].reduce(:+)
=> 6
[9] pry(main)> [].reduce(:+)
=> nil
[7] pry(main)> [1,2,nil].reduce(:+)
TypeError: nil can't be coerced into Integer
from (pry):7:in `+'
方法4: 当Array包含nil和空值时,默认情况下如果使用上述任何函数reduce、sum、inject,一切都会通过
TypeError: nil不能被强制转换为Integer
你可以通过,
[16] pry(main)> sum = 0
=> 0
[17] pry(main)> [1,2,3,4,nil, ''].each{|a| sum+= a.to_i }
=> [1, 2, 3, 4, nil, ""]
[18] pry(main)> sum
=> 10
方法6: eval
以字符串形式计算Ruby表达式。
[26] pry(main)> a = [1,3,4,5]
=> [1, 3, 4, 5]
[27] pry(main)> eval a.join '+'
=> 13
[30] pry(main)> a = [1,3,4,5, nil]
=> [1, 3, 4, 5, nil]
[31] pry(main)> eval a.join '+'
SyntaxError: (eval):1: syntax error, unexpected end-of-input
1+3+4+5+
对于nil值的数组,我们可以压缩,然后注入和 除
a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
如果你想打高尔夫,你可以
eval [123,321,12389]*?+
这将创建一个字符串“123+321+12389”,然后使用函数eval进行求和。这只是为了打高尔夫球,你不应该在正确的代码中使用它。
Ruby 2.4.0新增功能
您可以使用命名恰当的方法Enumerable#sum。与inject(:+)相比,它有很多优点,但在最后也有一些重要的注意事项需要阅读。
例子
范围
(1..100).sum
#=> 5050
数组
[1, 2, 4, 9, 2, 3].sum
#=> 21
[1.9, 6.3, 20.3, 49.2].sum
#=> 77.7
重要提示
这个方法不等同于#inject(:+)。例如
%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)
有关为什么sum是这样的更多信息,请参阅这个答案。