Hopefully (I'm sure) somebody can shed a light on this. This caught me by surprise
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux]
test.rb:
TEST =
def procs &block
TEST << block
end
#for n in [1,2,3] do
[1,2,3].each do |n|
procs do
puts "#{n}"
end
end
TEST.each do |t|
puts t
t.call
end
With for loop
···
ruby test.rb
#
3
#
3
#
3
With each
ruby test.rb
#
1
#
2
#
3
I thought for-loop behaves the same as each. Apparently not. Why is this and is this a good thing?
Thank you in advance
-andre
_________________________________________________________________
Windows Live Hotmail and Microsoft Office Outlook – together at last. Get it now.
They are not quite the same. for does not introduce a new scope, whereas
each does. So, each time through the for loop, the closures you are stashing
in TEST are all referencing the same scope. When you run the stashed procs,
you are in that same scope, n has the value 3 at the end the for statement
so that is what is printed.
In the each version, you get a new scope and hence a new n each time through
the loop, so the value of n saved in each closure is different.
Try the following:
for n in [1, 2, 3] do puts n end
puts n
[1, 2, 3].each do |m| puts m end
puts m
As for rationale - for is slightly faster (no new scope has to be created
each time round the loop) and is similar in appearance to for statements in
other languages. However, the scope issue breaks it in my opinion and I
never use it.
Regards,
Sean
···
On 10/19/07, Andreas S <andreas_s@hotmail.com> wrote:
Hopefully (I'm sure) somebody can shed a light on this. This caught me by
surprise
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux]
test.rb:
TEST =
def procs &block
TEST << block
end
#for n in [1,2,3] do
[1,2,3].each do |n|
procs do
puts "#{n}"
end
end
TEST.each do |t|
puts t
t.call
end
With for loop
>> ruby test.rb
#
3
#
3
#
3
With each
>> ruby test.rb
#
1
#
2
#
3
I thought for-loop behaves the same as each. Apparently not. Why is this
and is this a good thing?