From: Robert Klemme Date: 2004-09-06T04:40:12+09:00 Subject: Re: Style Question "Brian Schroeder" schrieb im Newsbeitrag news:pan.2004.09.05.11.20.28.668820@bssoftware.de... > Hello everybody, > > I've got a stylistic question. I know that "the ruby way" to implement > iterations is using .each and similar things, but sometimes I like to use > > for i in 0...n > for j in i...n > do something with i and for > end > end > > Thats nice. > > But if I want to iterate downwards the only way I found is 10.downto(0) do > | i | end > > That seems not as intuitive as the for notation. Especially if I want ruby > to teach algorithms to people who know how to read pseudo code, then I'd > like something like >> for i in 10.downto 0 >> for i in 0.upto 10 > > I think this has been discussed before, but I'd like to now which style > you use, or if I've missed the solution. > > regards, > > Brian > > PS: How is for implemented? Can I maybe teach Number.downto to return an > object that > is used by for to iterate like an inverse range? Even more straightforward: you can implement a range that supports both directions yourself plus arbitrary stepping like this: class Rg include Enumerable def initialize(from, to, step = sign(to - from)) raise ArgumentError, "Invalid step #{step}" if (to - from) * step <= 0 @from, @to, @step = from, to, step @to += @step - ((@to - @from) % @step) end def each x = @from until x == @to yield x x += @step end self end def sign(x) case when x > 0 1 when x == 0 0 else -1 end end end module Kernel private def Rg(from, to, *step) Rg.new(from, to, *step) end end Then you can do this: >> for i in Rg 0, 10, 2 >> puts i >> end 0 2 4 6 8 10 => # >> for i in Rg( 0, -10, -3 ) >> puts i >> end 0 -3 -6 -9 => # >> for i in Rg 0, -10 >> puts i >> end 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 => # Kind regards robert