Shpigford
Shpigford

Reputation: 25338

Ruby: How to iterate over a range, but in set increments?

So I'm iterating over a range like so:

(1..100).each do |n|
    # n = 1
    # n = 2
    # n = 3
    # n = 4
    # n = 5
end

But what I'd like to do is iterate by 10's.

So in stead of increasing n by 1, the next n would actually be 10, then 20, 30, etc etc.

Upvotes: 180

Views: 165335

Answers (4)

justsomeguy
justsomeguy

Reputation: 141

Here's another, perhaps more familiar-looking way to do it:

for i in (0..10).step(2) do
    puts i
end

Upvotes: 10

Arup Rakshit
Arup Rakshit

Reputation: 118271

You can use Numeric#step.

0.step(30,5) do |num|
  puts "number is #{num}"
end
# >> number is 0
# >> number is 5
# >> number is 10
# >> number is 15
# >> number is 20
# >> number is 25
# >> number is 30

Upvotes: 20

Jahan Zinedine
Jahan Zinedine

Reputation: 14874

rng.step(n=1) {| obj | block } => rng

Iterates over rng, passing each nth element to the block. If the range contains numbers or strings, natural ordering is used. Otherwise step invokes succ to iterate through range elements. The following code uses class Xs, which is defined in the class-level documentation.

range = Xs.new(1)..Xs.new(10)
range.step(2) {|x| puts x}
range.step(3) {|x| puts x}

produces:

1 x
3 xxx
5 xxxxx
7 xxxxxxx
9 xxxxxxxxx
1 x
4 xxxx
7 xxxxxxx
10 xxxxxxxxxx

Reference: http://ruby-doc.org/core/classes/Range.html

......

Upvotes: 7

Berin Loritsch
Berin Loritsch

Reputation: 11463

See http://ruby-doc.org/core/classes/Range.html#M000695 for the full API.

Basically you use the step() method. For example:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end

Upvotes: 288

Related Questions