Billjk
Billjk

Reputation: 10686

The 'upto' method in Ruby

I'm learning Ruby, and there has been a bit of talk about the upto method in the book from which I am learning. I'm confused. What exactly does it do?

Example:

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

Upvotes: 11

Views: 40964

Answers (6)

Chris Pettitt
Chris Pettitt

Reputation: 11

My example would have been this:

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

So what you're actually doing here is saying, I want to count up from 1 to the number 5, that's specifically what this part is saying:

1.upto(5)

The latter part of code (a block) is just outputting the iteration of going through the count from 1 up to 5. This is the output you might expect to see:

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

Note: This can be written is another way if you're using multilines:

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

Hope this helps.

Upvotes: 1

jndaigle
jndaigle

Reputation: 11

An alternative that looks more like Ruby to me is

require 'descriptive_statistics'

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

Of course it depends what you're doing.

Upvotes: 0

knut
knut

Reputation: 27875

Let's try an explanation:

You define an array

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

and prepare a variable to store the sum:

sum = 0

grades.length is 6 (there are 6 elements in the array), (grades.length - 1) is 5.

with 0.upto(5) you loop from 0 to 5, loop_index will be 0, then 1...

The first element of the array is grades[0] (the index in the array starts with 0). That's why you have to subtract 1 from the number of elements.

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

Add the loop_index's value to sum.

    sum += grades[loop_index]
end

Now you looped on each element and have the sum of all elements of the array.

You can calculate the average:

average = sum/grades.length

Now you write the result to stdout:

puts average

This was a non-ruby-like syntax. Ruby-like you would do it like this:

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

Addendum based on Marc-Andrés comment:

You may use also inject to avoid to define the initial sum:

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

Or even shorter:

grades = [88,99,73,56,87,64] 
average = grades.inject(:+) / grades.length 
puts average 

Upvotes: 28

ScottJShea
ScottJShea

Reputation: 7111

It is just another way to do a loop/iterator in Ruby. It says do this action n times based on i being the first number the the number in parens as the limit.

Upvotes: 1

teleolurian
teleolurian

Reputation: 21

Upto executes the block given once for each number from the original number "upto" the argument passed. For example:

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

will print out the numbers 1 through 10.

Upvotes: 2

Oliver Charlesworth
Oliver Charlesworth

Reputation: 272657

From http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_integer.html#upto:

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

Iterates block, passing in integer values from int up to and including anInteger.

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

produces:

5 6 7 8 9 10

Upvotes: 9

Related Questions