Iterators in Ruby

There are different kinds of iterators provided by ruby a few of them are

Each Iterator

The each iterator is used to iterate through the elements of the array.

arr = [1, 2, 3, 4, 5]
arr.each { |a| print a -= 10, " " }
# prints: -9 -8 -7 -6 -5

The reverse each iterator, iterates through the list in reverse order.

words = %w[first second third fourth fifth sixth]
str = ""
words.reverse_each { |word| str += "#{word} " }
p str #=> "sixth fifth fourth third second first "

each_with_index iterate over the elements in the array along with index.

arr = [1, 2, 3, 4, 5]
arr.each_with_index { |val,index| puts "index: #{index},value:#{val}"}
#output
index:0,value:1
index:1,value:2
index:2,value:3
index:3,value:4
index:4,value:5

Each Iterator can also be used with Hashes

h = { "a" => 100, "b" => 200 }
h.each {|key, value| puts "#{key} is #{value}" }
#output
a is 100
b is 200

h.each_key {|key| puts key }
#output
a
b

h.each_value {|value| puts value }
#output
100
200

Times Iterator

This iterator is used to iterate through the array from 0 to n-1 index positio

5.times do |i|
 print i, " "
end
#OUTPUT
#=> 0 1 2 3 4

Upto and Downto Iterators

This iterator is used to iterate from value of n to the limit(including limit)

5.upto(10) { |i| print i, " " }
#=> 5 6 7 8 9 10

This iterator is used to iterate decreasing values from n to the limit(including limit)

5.downto(1) { |n| print n, ".. " }
#=> "5.. 4.. 3.. 2.. 1.. 

Step Iterator

The step iterator invokes a block which increments by the value of step with each iteration till the condition mentioned becomes false.

1.step(10, 2) { |i| print i, " " }
#output 
1 3 5 7 9 => 1

Math::E.step(Math::PI, 0.2) { |f| print f, " " }
#output
2.718281828459045 2.9182818284590453 3.118281828459045 => 2.718281828459045

Each_Line Iterator

Splits str using the supplied parameter as the record separator ($/ by default), passing each substring in turn to the supplied block. If a zero-length record separator is supplied, the string is split into paragraphs delimited by multiple successive newlines.

print "Example one\n"
"hello\nworld".each_line {|s| p s}
print "Example two\n"
"hello\nworld".each_line('l') {|s| p s}
print "Example three\n"
"hello\n\n\nworld".each_line('') {|s| p s}
#OUTPUT
Example one
"hello\n"
"world"
Example two
"hel"
"l"
"o\nworl"
"d"
Example three
"hello\n\n\n"
"world"

Try