Robert Klemme
2/27/2005 8:41:00 PM
"Fear Dubh" <feardubh@spam.spam> schrieb im Newsbeitrag
news:cvt8g2$g47$1@reader01.news.esat.net...
> Hi,
>
> "Robert Klemme" <bob.news@gmx.net> wrote in message
> news:38ea7eF5o769pU1@individual.net...
>>
>> "Fear Dubh" <feardubh@spam.spam> schrieb im Newsbeitrag
>> news:cvslbj$9ns$1@reader01.news.esat.net...
>> >
>> > "ts" <decoux@moulon.inra.fr> wrote in message
>> > news:200502271128.j1RBSA019680@moulon.inra.fr...
>> >> >>>>> "F" == Fear Dubh <feardubh@spam.spam> writes:
>> >>
>> >> F> Is there a difference between:
>> >> F> for foo in bar do ...
>> >> F> and
>> >> F> bar.each do |foo| ...
>> >>
>> >> uln% ruby -e 'for a in [12] do end; p a'
>> >> 12
>> >> uln%
>> >>
>> >> uln% ruby -e '[12].each do |a| end; p a'
>> >> -e:1: undefined local variable or method `a' for main:Object
> (NameError)
>> >> uln%
>> >>
>> >>
>> > Thanks!
>> >
>> > Does each have a fatter frame then?
>> > Is "for ... in ... do ..." more efficient?
>>
>> I would believe not, but you can test this yourself (hint "ruby -r
> profile"
>> and module Benchmark).
>>
>> Indenpendently of that I strongly recommend the usage of "each" as it is
>> used 99% of the cases and it's simply standard. Although it's not an
>> enforced convention, people will expect that and it makes everybody's
>> life
>> easier to stick to some conventions.
>>
> OK, Thanks,
>
> Now I feel like a bold child, scolded for stuffing my face
> with this delicious syntax sugar! :-)
LOL
> I have a further question:
> As ts showed "for ... in ... do" is not exactly the same as "... each do
> ...",
> so is there an "un-sugared" expression that is equivalent to "for ..."?
Probably this:
x = nil
enum.each {|x| ...}
# x carries the last value here
> Is there any circumstance where it would be better to use "for"?
Frankly speaking, I can't remember having felt the need for "for". But you
can argue that it looks better for numeric ranges:
$ ruby -e 'for i in 1..5 do puts i end; puts i'
1
2
3
4
5
5
Robert@Babelfish2 ~
$ ruby -e 'i=nil; (1..5).each{|i| puts i}; puts i'
1
2
3
4
5
5
To be honest, I've completely forgotton "for .. in" and I use #each even for
numeric ranges - in spite of the uglyness. :-) Btw, there's also #upto,
#downto and #step:
$ ruby -e '1.step(10,2){|i| puts i}'
1
3
5
7
9
Robert@Babelfish2 ~
$ ruby -e '1.upto(5){|i| puts i}'
1
2
3
4
5
Robert@Babelfish2 ~
$ ruby -e '5.downto(1){|i| puts i}'
5
4
3
2
1
Kind regards
robert