FOR or EACH?

When looping through arrays. What'd you argue to be good (or best) practice?

<% for something in @lots_of_things %> <%= something.name %> <% end %>

<% @lots_of_things.each do |something| %> <%= something.name %> <% end %>

I've read mixed opinions on this small topic. Some say that FOR loops are easier, though I cannot see how. Others say that EACH is a more 'railsy' method...

Personally, I tend to use EACH as I was taught this to be correct and follow this rule to retain consistency in MY code. What is your opinion on this?

Pale Horse wrote:

When looping through arrays. What'd you argue to be good (or best) practice?

<% for something in @lots_of_things %> <%= something.name %> <% end %>

<% @lots_of_things.each do |something| %> <%= something.name %> <% end %>

I've read mixed opinions on this small topic. Some say that FOR loops are easier, though I cannot see how. Others say that EACH is a more 'railsy' method...

Not Railsy so much as Rubyish.

Personally, I tend to use EACH as I was taught this to be correct and follow this rule to retain consistency in MY code. What is your opinion on this?

I do likewise. To tell you the truth, I don't even remember that the for construct exists until I see it in other people's code.

Best,

Marnen Laibow-Koser wrote:

Pale Horse wrote:

When looping through arrays. What'd you argue to be good (or best) practice?

<% for something in @lots_of_things %> <%= something.name %> <% end %>

<% @lots_of_things.each do |something| %> <%= something.name %> <% end %>

I've read mixed opinions on this small topic. Some say that FOR loops are easier, though I cannot see how. Others say that EACH is a more 'railsy' method...

Not Railsy so much as Rubyish.

Exactly.

Personally, I tend to use EACH as I was taught this to be correct and follow this rule to retain consistency in MY code. What is your opinion on this?

I do likewise. To tell you the truth, I don't even remember that the for construct exists until I see it in other people's code.

Indeed, and old code at that in my case. I remember it from when briefly I looked into C.

Best, -- Marnen Laibow-Koser http://www.marnen.org marnen@marnen.org

I'm interested to get people's input on this. Some Rails programmers still persist on using FOR. Understandable if they have extensive programming background including Ruby.

Pale Horse wrote: [...]

I do likewise. To tell you the truth, I don't even remember that the for construct exists until I see it in other people's code.

Indeed, and old code at that in my case. I remember it from when briefly I looked into C.

The for loop in C is like the for loop in BASIC, not the for...in loop in Ruby. Ruby's for...in is like the for...in (or foreach) in Perl, PHP, or recent versions of Java. Despite the use of the same keyword, they're two very different constructs.

Best, -- Marnen Laibow-Koser http://www.marnen.org marnen@marnen.org

I'm interested to get people's input on this. Some Rails programmers still persist on using FOR. Understandable if they have extensive programming background including Ruby.

...which I do. But for...in just doesn't feel like a good fit for Ruby to me -- it feels more like syntactic sugar for Perl and PHP programmers.

Best,

Marnen Laibow-Koser wrote:

The for loop in C is like the for loop in BASIC, not the for...in loop in Ruby. Ruby's for...in is like the for...in (or foreach) in Perl, PHP, or recent versions of Java. Despite the use of the same keyword, they're two very different constructs.

Best, -- Marnen Laibow-Koser http://www.marnen.org marnen@marnen.org

I'm interested to get people's input on this. Some Rails programmers still persist on using FOR. Understandable if they have extensive programming background including Ruby.

...which I do. But for...in just doesn't feel like a good fit for Ruby to me -- it feels more like syntactic sugar for Perl and PHP programmers.

That's likely to be the reason for the choice to use FOR, then. Interesting.

Hey,

I personally use .each, but if you're looking to squeeze every bit of performance from your app, use for, as it's about 7% faster than .each.

http://rubybenchmark.com/reports/12

Regards Kieran

I can't comment on the accuracy or otherwise of the benchmark itself, but note that even if it is correct then the 7% faster will only be for a virtually empty loop. If you put anything worthwhile in the loop then I expect that any difference between iteration methods will be swamped by the processing of the loop contents.

Colin

Hi --

...which I do. But for...in just doesn't feel like a good fit for Ruby to me -- it feels more like syntactic sugar for Perl and PHP programmers.

Evidence for that can be found in the fact that for is implemented in terms of each:

   obj = Object.new    def obj.each      puts "Here I am in each, about to yield 100!"      yield 100    end

   for a in obj      puts a    end

Output:    Here I am in each, about to yield 100!    100

Another demo:

   $ ruby -e 'for a in 3; end'    -e:1:in `<main>': undefined method `each' for 3:Fixnum (NoMethodError)

There's a slight difference in how they work, in the sense that each takes a code block (at least, as usually implemented), while for is in flat scope, similar to an if-statement:

   for a in [1]      b = 100    end

   p b # 100

I don't know of any cases where having the flat scope would be so important as to lead me to use for if I didn't have some other reason to (which I don't think I ever have).

David

+1 for each (second). To me, the for reminds me of other languages where you have to tell it what type of item the collection you are iterating contains (I am thinking of C#), but in Ruby is not really an issue. I would be interested in other opinions but to me not using ‘for’ just seems ‘right’ and an easier read, maybe b/c this is what I seem to see most often.

The design patterns book on Ruby I’m checking out says this:

Ruby also has a for loop, which you can use, among other things, to sequence

through arrays:

array = [‘first’, ‘second’, ‘third’]

array.each do |x|

puts(x)

end

Surprisingly, for loops are rare in real Ruby programs. A Ruby programmer is

much more likely to write this equivalent code instead:

array.each do |x|

puts(x)

end

We will have much more to say about this odd-looking loop thing in Chapter 7.

For now, just think of the each syntax as another way to write a for loop.

Can't remember which book I saw it in (possibly Metaprogramming Ruby) but at the beginning there is a statement along the lines of:

Think of an array. Now think of accessing that array. If your first thought is a for loop then you need to read more about Ruby, if your first thought is .each then you are ready to begin the concepts in this book....... (something like that)

FWIW

Paul

paul h wrote:

Can't remember which book I saw it in (possibly Metaprogramming Ruby) but at the beginning there is a statement along the lines of:

Think of an array. Now think of accessing that array. If your first thought is a for loop then you need to read more about Ruby, if your first thought is .each then you are ready to begin the concepts in this book....... (something like that)

I'd be in agreement with that.