From: Eric Mahurin Date: 2005-05-12T06:31:53+09:00 Subject: Re: object loops and what they return > > Consider these loops: > > > > . { } > > > > 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