【问题标题】:Ruby: sum the outputs of .each iterationRuby:总结 .each 迭代的输出
【发布时间】:2019-03-29 20:54:15
【问题描述】:

我正在做一个 Ruby 项目来制作公路旅行计算器。该程序从多个用户那里获取每加仑英里数和油箱大小来计算和比较燃油经济性。在下面的代码部分中,我想遍历一个名为车辆的数组,并将 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)。我完全不知道如何获取这些数字并添加它们,特别是因为它会根据用户输入信息的数量而产生不同的输出量。

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

【问题讨论】:

  • 你能提供一个元素很少的数组样本吗?或者vehicles.sum { |total_fuel| 3000.0 / total_fuel[:mpg] }
  • @iGian 这里是一个具有三个输入的数组示例[{:name=>"John", :mpg=>24, :tank=>15, :maintenance=>4}, {:name=>"Sue", :mpg=>16, :tank=>10, :maintenance=>2}, {:name=>"Tom", :mpg=>31, :tank=>20, :maintenance=>5}]<br/> 您提供的代码行虽然有效!
  • 请将您的示例输入放在问题本身中。另外,如果您对车辆求和,您如何比较燃油经济性?

标签: arrays ruby sum iteration each


【解决方案1】:

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

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

一个密切相关且非常有用的方法是reduce,它允许您指定应该如何将多个值缩减为一个。这是一个与sum 相同的示例:

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

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

查看Enumerable 模块的文档,了解更多适用于数组和散列的有用方法。

【讨论】:

    【解决方案2】:

    你应该使用mapsum

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

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

    【讨论】:

    • 注意,这通常比使用带有块的sum 更差。
    【解决方案3】:

    使用Enumerable#inject 的另一种选择:

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

    请使用3000.0 而不是3000,这样你会得到浮动结果。

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 2010-12-14
      • 2012-10-17
      • 2016-03-24
      • 1970-01-01
      • 2014-08-30
      • 2018-03-25
      相关资源
      最近更新 更多