> > Consider these loops:
> >
> > <object>.<loop-method> { <code> }
> >
> > where loop method is each, each_with_index, upto, downto,
> step,
> > and probably others.
> >
> > Although it is not documented, all of these look to return
> the
> > origninal object (collection or int).  Does anybody find
> this
> > useful??  If not, I would propose that these return nil
> just
> > like loop, while, until, begin/end while, and begin/end
> until.
> > I've never found the return value of these methods useful,
> but
> > I have found the the built-in loops returning nil useful. 
> Here
> > are a couple:
> >
> > # find first index where you find the object obj in array
> > index = array.each_with_index do |i,x|
> >    break(i) if obj.equal?(x)
> > end
> >
> > # find last index where you find the object obj in array
> > index = (array.size-1).downto(0) do |i,x|
> >    break(i) if obj.equal?(x)
> > end
> 
> >> a=%w{a b c d e f g ab c}
> => ["a", "b", "c", "d", "e", "f", "g", "ab", "c"]
> >> a.index "c"
> => 2
> >> a.rindex "c"
> => 8
> >> a.index "foo"
> => nil

I was wanting to compare the objects with equal? (compares
object ids) not == (what index/rindex use).

> > The problem with the above now is that index will be the
> loop
> > object (array and array.size-1 from above) when you don't
> find
> > the obj.  Instead of the above, I end up using old-style
> loops
> > to accomplish what I want.
> >
> > With "each" returning nil, you can also see that many of
> the
> > derived loops in Enumerable become trival almost to where
> you
> > don't need them.
> 
> Interesting aspect.  I assume the return behavior is from a
> time where break 
> could not return a value so your constructions weren't
> possible.
> 
> Typically I put such functionality into methods and then I
> use "return" to 
> short circuit:
> 
> module Enumerable
>   def find_pos(x)
>     each_with_index {|e,i| return i if x == e}
>     nil
>   end
> 
>   def find_cond
>     each_with_index {|e,i| return i if yield e}
>     nil
>   end
> end

The loops I describe above were in some method.  I didn't want
to create a new method just for those loops.  That would be
kind of silly.  I used traditional loops instead.  Also, with
what I am proposing you wouldn't need the "nil" in the above 2
methods.

Does anybody find a use for these loop methods returning the
original object (undocumented) instead of nil (like other
loops)?  If not, I would like to make an RCR for this.



		
__________________________________ 
Do you Yahoo!? 
Yahoo! Mail - Helps protect you from nasty viruses. 
http://promotions.yahoo.com/new_mail