Ruby: суммировать результаты каждой итерации - PullRequest
0 голосов
/ 25 октября 2018

Я работаю над проектом 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).Я совершенно заблудился, как потом взять эти цифры и добавить их, тем более что это будет разное количество выводов в зависимости от того, сколько пользователей вводило информацию.

Надеюсь, это было понятно.Есть идеи?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы должны использовать map и sum

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

или

total_fuel = vehicles.map { |vehicle| 3000 / vehicle[:mpg] }.reduce(:+)
# for Ruby version < 2.4
0 голосов
/ 25 октября 2018

Просто еще один вариант с использованием Enumerable # inject :

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

Пожалуйста, используйте 3000.0 вместо 3000, чтобы получить результат с плавающей запятой.

0 голосов
/ 25 октября 2018

Звучит так, как вам нужен метод sum .В вашем случае вы не хотите просто выполнять итерации по всем транспортным средствам и выполнять блок, а хотите суммировать результаты блока и возвращать одно значение.

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

Тесно связанный и оченьполезный метод - уменьшение , который позволяет вам указать, как именно несколько значений должны быть сведены в одно.Вот пример, который делает то же самое, что и sum:

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

Но так как вы можете точно указать, как должны комбинироваться значения, метод может применяться в большем количестве случаев, чем sum.

Ознакомьтесь с документацией для модуля Enumerable для более полезных методов работы с массивами и хешами.

...