Ruby:将.each迭代的输出求和

时间:2018-10-25 09:32:01

标签: arrays ruby sum iteration each

我正在一个Ruby项目中制作公路旅行计算器。该程序从多个用户获取每加仑英里数和油箱尺寸,以计算和比较燃油经济性。在下面的代码部分中,我想遍历一个名为Vehicles的数组,并将3000除以该数组中每个元素的mpg。

我正在为下一步工作苦苦挣扎:获取这些输出并将它们相加(每个输出分别为3000 / total_fuel [:mpg] + 3000 / total_fuel [:mpg] + 3000 / total_fuel [:mpg] ...元件)。到目前为止,这就是我所拥有的:

    vehicles.each do |total_fuel|
      total_fuel = (3000 / total_fuel[:mpg])
      print total_fuel
    end

在打印时,它只是将计算结果彼此紧挨输出,没有空格(例如150166)。我对如何获取这些数字并将其相加完全迷失了,尤其是因为根据输入信息的用户数量,输出的数量将有所不同。

我希望这很清楚。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

听起来您需要sum方法。在您的情况下,您不想只遍历所有车辆并执行一个块,而是想对块的结果求和并返回一个值。

 total_fuel = vehicles.sum do |vehicle|
   3000 / vehicle[:mpg]
 end

一个非常相关且非常有用的方法是reduce,它使您可以指定将多个值精确地减少为一个的方法。这是一个与sum相同的示例:

# Sum some numbers
(5..10).reduce(:+)                             #=> 45

但是由于您可以精确指定值的组合方式,因此该方法可以比sum应用于更多情况。

请查看Enumerable模块的文档,以获取适用于数组和哈希的更有用的方法。

答案 1 :(得分:0)

您应该使用mapsum

total_fuel = vehicles.map { |vehicle| 3000 / vehicle[:mpg] }.sum

total_fuel = vehicles.map { |vehicle| 3000 / vehicle[:mpg] }.reduce(:+)
# for Ruby version < 2.4

答案 2 :(得分:0)

另一个使用Enumerable#inject的选项:

total_fuel =  = vehicles.inject(0) { |total_fuel, vehicle| total_fuel += 3000.0 / vehicle[:mpg] }

请使用3000.0而不是3000,以便获得浮动结果。