Этот код должен работать, если вы вызываете этот метод, но метод не нуждается в аргументах. Эти переменные в любом случае объявляются локально.
Прямо сейчас вы бы сделали:
average_of_three(0, 0, 0)
Там, где начальные значения не имеют значения, так как вы все равно их игнорируете. Они могут быть :zero
или "Who cares!"
точно такими же.
Это не очень Ruby-код. При написании Ruby сначала думайте о структурах данных.
Например, чтобы получить три значения:
def get_n(n = 3)
n.times.map do |i|
print "Enter number #{i+1}: "
gets.to_i
end
end
Это задает ряд вопросов и сохраняет результат в массиве, что делает map
.
Теперь вы можете усреднить те:
def average(values)
return unless (values.any?)
values.sum / values.length
end
Имеется охранное предложение , в котором оно не будет выполнено, если не будет хотя бы одного значения. Затем он вызывает sum
, что неудивительно складывает все значения. Разделите на длину, и все готово.
Так что вы бы связали все это с:
values = get_n
puts "Average is: #{average(values)}"
Примечание. В Ruby, когда вы делите целое число на целое, вы всегда получаете целое число. Это означает, что значения округляются. Если вы предпочитаете получать дробные результаты, вы можете переключить входной преобразователь с .to_i
на .to_f
. Это изменение приведет к тому, что float будет проходить через остальную часть кода.