如何在Ruby中仅求数组中对象属性的正负值之和

如何在Ruby中仅求数组中对象属性的正负值之和,ruby,arrays,sum,inject,Ruby,Arrays,Sum,Inject,我知道我可以使用inject方法在Ruby中对数组中的对象的属性求和。例如,我可以使用以下公式对数组中所有代理的现金进行求和: sum_of_cash = agents.inject(0) { |sum, e| sum + e.cash } 但是,我如何才能仅对物业的正值或负值进行求和,例如,仅对正值或负值现金余额进行求和 我能想到的一种方法是使用if函数在数组上进行循环,并且仅当值为正数时求和,但是如果可能的话,我正在寻找一种更干净的方法 谢谢 我觉得像这样的东西更优雅一点 agents.m

我知道我可以使用inject方法在Ruby中对数组中的对象的属性求和。例如,我可以使用以下公式对数组中所有代理的现金进行求和:

sum_of_cash = agents.inject(0) { |sum, e| sum + e.cash }
但是,我如何才能仅对物业的正值或负值进行求和,例如,仅对正值或负值现金余额进行求和

我能想到的一种方法是使用if函数在数组上进行循环,并且仅当值为正数时求和,但是如果可能的话,我正在寻找一种更干净的方法


谢谢

我觉得像这样的东西更优雅一点

agents.map(&:cash).select { |c| c > 0 }.inject(&:+)

我觉得像这样的东西更优雅一点

agents.map(&:cash).select { |c| c > 0 }.inject(&:+)

我可以想出两种方法,不需要在注入中使用
if

  • 将适当的方法添加到代理对象。然后您可以编写以下代码:

    sum_of_cash=代理。注入(0){sum,e|sum+e.positive_cash}

  • 注入前过滤器:

    sum\u of_case=agents.map(&:cash)。如果{c | c>0},则保留。reduce(&:+)


  • 我可以想出两种方法,不需要在注入中使用
    if

  • 将适当的方法添加到代理对象。然后您可以编写以下代码:

    sum_of_cash=代理。注入(0){sum,e|sum+e.positive_cash}

  • 注入前过滤器:

    sum\u of_case=agents.map(&:cash)。如果{c | c>0},则保留。reduce(&:+)


  • 请注意,使用
    keep\u if
    将销毁
    代理的原始内容。最好
    选择
    。请注意,如果
    您正在销毁
    代理的原始内容,请使用
    保留\u。最好选择