Метод upto в Ruby - PullRequest
       1

Метод upto в Ruby

8 голосов
/ 16 марта 2012

Я изучаю Ruby, и в книге было много разговоров о методе upto, из которого я учусь. Я не совсем понимаю. Что именно это делает?

Пример:

grades = [88,99,73,56,87,64]
sum = 0
0.upto(grades.length - 1) do |loop_index|
    sum += grades[loop_index]
end
average = sum/grades.length
puts average

Ответы [ 6 ]

25 голосов
/ 16 марта 2012

Давайте попробуем объяснить:

Вы определяете массив

grades = [88,99,73,56,87,64]

и подготавливаете переменную для хранения суммы:

sum = 0

grades.length равно 6(в массиве 6 элементов), (grades.length - 1) равно 5.

с 0.upto(5), в котором вы выполните цикл от 0 до 5, loop_index будет 0, затем 1 ...

Первый элемент массива - grades[0] (индекс в массиве начинается с 0).Вот почему вы должны вычесть 1 из числа элементов.

0.upto(grades.length - 1) do |loop_index|

Добавьте значение loop_index к сумме.

    sum += grades[loop_index]
end

Теперь вы зациклились на каждом элементе и получили сумму всехэлементы массива.

Вы можете вычислить среднее значение:

average = sum/grades.length

Теперь вы записываете результат в стандартный вывод:

puts average

Это было синтаксис, не похожий на рубиновый .Как и в Ruby, вы бы сделали это так:

grades = [88,99,73,56,87,64]
sum = 0
grades.each do |value|
    sum += value
end
average = sum/grades.length
puts average

Приложение на основе комментария Марка-Андреса:

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

grades = [88,99,73,56,87,64] 
sum = grades.inject do |sum, value|     
  sum + value 
end
average = sum / grades.length 
puts average 

Или даже короче:

grades = [88,99,73,56,87,64] 
average = grades.inject(:+) / grades.length 
puts average 
5 голосов
/ 16 марта 2012

С http://www.ruby -doc.org / docs / ProgrammingRuby / html / ref_c_integer.html # до :

до int.upto( anInteger ) {| i | block }

Повторяет block, передавая целочисленные значения от int до и в том числе anInteger.

5.upto(10) { |i| print i, " " }

производит:

5 6 7 8 9 10
2 голосов
/ 16 марта 2012

Upto выполняет блок, заданный один раз для каждого числа от исходного числа «до» переданного аргумента.Например:

1.upto(10) {|x| puts x}

выведет цифры от 1 до 10.

1 голос
/ 16 марта 2012

Это просто еще один способ сделать цикл / итератор в Ruby.Он говорит, что выполните это действие n раз, исходя из того, что я являюсь первым числом числом в скобках в качестве предела.

0 голосов
/ 03 августа 2017

Мой пример мог бы быть таким:

1.upto(5)  { |i| puts "Countup: #{i}" }

Итак, что вы на самом деле здесь делаете, так это то, что вы на самом деле говорите: я хочу сосчитать с 1 до 5, именно это и говорит эта часть:

1.upto(5)

Последняя часть кода (блока) просто выводит итерацию прохождения счетчика от 1 до 5. Это вывод, который вы можете ожидать увидеть:

    Countup: 1
    Countup: 2
    Countup: 3
    Countup: 4
    Countup: 5

Примечание : это можно записать другим способом, если вы используете многоканальный режим:

1.upto(5) do |i|
puts "Countup: #{i}"
end

Надеюсь, это поможет.

0 голосов
/ 17 июня 2016

Альтернатива, которая для меня больше похожа на Ruby:

require 'descriptive_statistics'

grades=[88,99,73,56,87,64]
sum = grades.sum
average = grades.mean
sd = grades.standard_deviation

Конечно, это зависит от того, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...