Go4Expert

Go4Expert (http://www.go4expert.com/)
-   Ruby on Rails (http://www.go4expert.com/articles/ruby/)
-   -   Loops & Iterators in Ruby (http://www.go4expert.com/articles/loops-iterators-ruby-t6370/)

pradeep 15Sep2007 12:54

Loops & Iterators in Ruby
 

Loops



Ruby provides the basic while and unless loops and iterators. Let us go through while and until first before looking at iterators.

A "while" loop defines that a statement or block of code is to be rerun time and time again while a condition remains true, and then execution is to continue after the statement or block. An "until" loop says that the block is to be performed until the condition goes true (i.e. while it is false).

Just like the "if" and "unless", "while" and "until" are written with an 'end' key-worded block, or as modified after a piece of code.

Code: Ruby

top = 4
 
 # A while loop, counting up
 now = 0
 while now < top
     puts "while #{now} .. #{top}"
     now += 1
     end
 
 
 # While written in one line
 now = 0
 print "#{now+=1} " while now < top
 print "\n"
 
 
 # An until loop
 now = 0
 until now > top
     puts "until #{now} .. #{top}"
     now += 1
     end
 
 
 # Until written in one line
 total = 1
 bugs = 19
 needed *= 2 until needed >= bugs
 print "You have #{teams} bugs so ideally ",
         "there are #{total}.\n"

Output:
Code:

while 0 .. 4
 while 1 .. 4
 while 2 .. 4
 while 3 .. 4
 1 2 3 4
 until 0 .. 4
 until 1 .. 4
 until 2 .. 4
 until 3 .. 4
 until 4 .. 4
 You have 19 teams so ideally need 32.

Iterators



The method "each" when run on what we call a collection object will cause a block of code to be run on each of the elements of the collection object in turn. Yes, that's rather different to many other languages (though it does parallel foreach in PHP and for in Python).

You can write a loop that looks reasonably conventional to step up through a series of numbers - example coming up - but in addition you can write far clearer and more elegant loops to process all the members of a collection in turn, without having to refer to them by their position number all the time.

Code: Ruby

# Some for loops that might almost look familiar
 
 # From 1 to 20
 for k in 1..20
    print k," "
 end
 print "\n"
 
 
 # From 1, stopping short of 20
 for k in 1...20
    print k," "
 end
 print "\n"
 
 
 # An iterator object
 (5..15).each do |k|
    print k," "
 end
 print "\n"

Output:
Code:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 5 6 7 8 9 10 11 12 13 14 15

Note: The .. and ... operators, and the subtle difference - in the first case, returns an iterator that runs up from the first to the last number, but in the second case the iterator stops one short of the last number.


All times are GMT +5.5. The time now is 00:27.