That sure looks ugly. I don't see any advantage of this over:
my_array.each do |item|
puts "item"
end
if my_array.empty?
puts "(no items found)"
end
What you have below doesn't look to readable and it is using
undocumented behavior (the docs don't say what each returns
only that it is an enumeration). In ruby 1.6 docs, it says
that each_with_index returns nil and now it returns the object.
···
Yes. Not often, but occasionally the return value is useful.
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: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:
> >
> > <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"
> => nilI 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
> endThe 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
__________________________________
Yahoo! Mail Mobile
Take Yahoo! Mail with you! Check email on your mobile phone.
http://mobile.yahoo.com/learn/mail