rubyloopsforeachiterationeach

"for" vs "each" in Ruby


I just had a quick question regarding loops in Ruby. Is there a difference between these two ways of iterating through a collection?

# way 1
@collection.each do |item|
  # do whatever
end

# way 2
for item in @collection
  # do whatever
end

Just wondering if these are exactly the same or if maybe there's a subtle difference (possibly when @collection is nil).


Solution

  • This is the only difference:

    each:

    irb> [1,2,3].each { |x| }
      => [1, 2, 3]
    irb> x
    NameError: undefined local variable or method `x' for main:Object
        from (irb):2
        from :0
    

    for:

    irb> for x in [1,2,3]; end
      => [1, 2, 3]
    irb> x
      => 3
    

    With the for loop, the iterator variable still lives after the block is done. With the each loop, it doesn't, unless it was already defined as a local variable before the loop started.

    Other than that, for is just syntax sugar for the each method.

    When @collection is nil both loops throw an exception:

    Exception: undefined local variable or method `@collection' for main:Object