From: "Michael W. Ryder" <_mwryder@...> Date: 2007-03-21T04:00:11+09:00 Subject: Re: C(++) For Loop Equivalents Pe�a wrote: > From: Michael W. Ryder [mailto:_mwryder@worldnet.att.net] : > > # He would need to initialize i before your code as it could be > # any value, > # not just 0. By the same token the increment could be any number, not > # just 1. > > fwiw, this is a simple example (intended for nubies only). > > C:\family\ruby>cat -n test.rb > 1 #--------------------------- > 2 #emulate c++ for (the better) > 3 #for(int i=0; i*j/2 4 # { > 5 # //cool method stuff > 6 # } > 7 #--------------------------- > 8 > 9 # using normal while loop > 10 puts "using while..." > 11 j=20 > 12 i=0 > 13 maxnum=100 > 14 while i*j/2 < maxnum do > 15 puts i > 16 i+=1 > 17 end > 18 > 19 # let's make our own for() and call it for_simple :) > 20 # note, there's no condition here > 21 # we're leaving it up to yield/blocks since that > 22 # is the ideal way, imho > 23 def for_simple (init=0,incr=1) > 24 i = init > 25 loop do > 26 yield i > 27 i += incr > 28 end > 29 end > 30 > 31 # now let's test it > 32 puts < 33 Test I. > 34 using our own simple for()... note advantage, > 35 we don't need to track the counter... > 36 TEXT > 37 > 38 for_simple do |i| > 39 break unless i*j/2 < maxnum > 40 puts i > 41 end > 42 > 43 puts < 44 Test II. > 45 here we initialize to 2 and increment by 2 > 46 again, we don't need to track the counter... > 47 TEXT > 48 > 49 for_simple(2,2) do |i| > 50 break unless i*j/2 < maxnum > 51 puts i > 52 end > 53 > 54 puts < 55 Test III. > 56 again, here we initialize to 200 and decrement by 20 > 57 again, we don't need to track the counter... > 58 and note, we change keyword unless to if > 59 ruby just simply rocks.. > 60 TEXT > 61 > 62 for_simple(200,-20) do |i| > 63 break if i*j/2 < maxnum > 64 puts i > 65 end > > C:\family\ruby>ruby test.rb > using while... > 0 > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > Test I. > using our own simple for()... note advantage, > we don't need to track the counter... > 0 > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > Test II. > here we initialize to 2 and increment by 2 > again, we don't need to track the counter... > 2 > 4 > 6 > 8 > Test III. > again, here we initialize to 200 and decrement by 20 > again, we don't need to track the counter... > and note, we change keyword unless to if > ruby just simply rocks.. > 200 > 180 > 160 > 140 > 120 > 100 > 80 > 60 > 40 > 20 > > C:\family\ruby> > > Hth. > kind regards -botp > > Now is it possible, like in Scheme, to assign a variable to a string and have Ruby evaluate the string? For example, f = "i*j/2". This would allow one to make a more generic version of your methods. Ideally you would have for_opt (i=0, f, inc=1) and have the method evaluate each of the variables if necessary. This would allow one to copy working C code without having to remember to do a lot of extraneous coding.