[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: object loops and what they return

Eric Mahurin

5/11/2005 9:32:00 PM

> > 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.co...