From: Gavin Kistner Date: 2005-05-12T07:04:52+09:00 Subject: Re: object loops and what they return ------_=_NextPart_001_01C55675.79467BAC Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Yes. Not often, but occasionally the return value is useful. =20 For example, there was a solution like this posted to the rails mailing = list, on how to iterate over all the items in a record, or print out a = 'no records found' type line if none existed: =20 if my_array.each do |item| puts "item" end.empty? puts "(no items found)" end ________________________________ From: Eric Mahurin [mailto:eric_mahurin@yahoo.com] Sent: Wed 5/11/2005 3:31 PM To: ruby-talk ML 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 =3D 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 =3D (array.size-1).downto(0) do |i,x| > > break(i) if obj.equal?(x) > > end > > >> a=3D%w{a b c d e f g ab c} > =3D> ["a", "b", "c", "d", "e", "f", "g", "ab", "c"] > >> a.index "c" > =3D> 2 > >> a.rindex "c" > =3D> 8 > >> a.index "foo" > =3D> nil I was wanting to compare the objects with equal? (compares object ids) not =3D=3D (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 =3D=3D 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. =20 __________________________________ Do you Yahoo!? Yahoo! Mail - Helps protect you from nasty viruses. http://promotions.yahoo.com/new_mail ------_=_NextPart_001_01C55675.79467BAC--