Arrays 如何在ruby数组中只添加正数?

Arrays 如何在ruby数组中只添加正数?,arrays,ruby,math,conditional-statements,Arrays,Ruby,Math,Conditional Statements,我是ruby的新手,我正在尝试制作一个方法,可以得到所有正数的和,任何一个数字数组。以下是一个例子: arr=(1,3,-1,7,4,-9,0,3) 这是我到目前为止尝试过的,但它只得到包含负值的和 def positive_sum(arr) arr.inject(0){|sum,x| sum + x } end 我的答案是:1+3+7+4+3=18,所以它忽略了所有的负数。提前感谢。您可以: > arr=[1,3,-1,7,4,-9,0,3] => [1, 3, -

我是ruby的新手,我正在尝试制作一个方法,可以得到所有正数的和,任何一个数字数组。以下是一个例子:

arr=(1,3,-1,7,4,-9,0,3)
这是我到目前为止尝试过的,但它只得到包含负值的和

def positive_sum(arr)

   arr.inject(0){|sum,x| sum + x  }

end
我的答案是:1+3+7+4+3=18,所以它忽略了所有的负数。提前感谢。

您可以:

> arr=[1,3,-1,7,4,-9,0,3]
=> [1, 3, -1, 7, 4, -9, 0, 3]
irb(main):005:0> arr.select{|e| e>=0}
=> [1, 3, 7, 4, 0, 3]
要获得正数,然后使用
sum
方法:

> arr.select{|e| e>=0}.sum
=> 18
还有
的快捷方式。选择(&:positive?)

然后你可以在上面使用
.sum

如果要将条件与
.inject
一起使用,则需要了解每个条件都需要返回一个值,该值在
inject
执行的还原中使用。否则,您将混合失败条件中的
nil
,而
.inject
将不知道如何将其添加到总和中。解决方案是使用目前为止返回总和的三元数,而不是仅返回总和+n

下面是一个使用
测试的条件
.inject
示例?true:false
在条件为true和false时返回正确的值:

> arr.inject{|s,n| n>0 ? s+n : s }
=> 18
或者先过滤掉负数,然后使用inject作为求和方法:

> arr.select(&:positive?).inject(:+)
=> 18
同样的方法也适用于
。reduce

> arr.reduce{ |s,n| n>0 ? s+=n : s }
=> 18
> arr.select(&:positive?).reduce(:+)
=> 18
您还可以使用
.partition
将正片和负片分开,并同时处理这两种情况:

> arr.partition{|e| e>0}.each{|sa| p sa, sa.sum }
[1, 3, 7, 4, 3]
18
[-1, -9, 0]
-10
或:


Ruby是一种非常灵活的语言…

arr.sum(0){n |[n,0].max}
arr.select{n | n>0}.sum(0)
@CarySwoveland:
arr.select(&:positive?).sum
谢谢,这是有效的,我发现另一个有效的方法是arr.select{x | x>0}.reduce
> arr.partition{|e| e>0}.each{|sa| p sa, sa.sum }
[1, 3, 7, 4, 3]
18
[-1, -9, 0]
-10
> arr.partition{|e| e>0}.map{|sa| sa.sum}
=> [18, -10]