"Brian Schroeder" <spam0504 / bssoftware.de> 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
=> #<Rg:0x10186da0 @from=0, @step=2, @to=12>
>> for i in Rg( 0, -10, -3 )
>>   puts i
>> end
0
-3
-6
-9
=> #<Rg:0x101801a0 @from=0, @step=-3, @to=-12>
>> for i in Rg 0, -10
>> puts i
>> end
0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
=> #<Rg:0x10199ce8 @step=-1, @to=-11, @from=0>


Kind regards

    robert