1.for循环会在循环以外的scope创建一个局部变量,看下面代码:
for i in [1,2,3] do
p i
end #123
p i#3
这和each是有区别的,each只是会改变scope外面已存在的局部变量:
[1,2,3].each do |i|
print i
end
p i#undefined local variable or method `i' for main:Object (NameError)
i=5
[1,2,3].each do |i|
print i
end
p i#1233
2.在和Proc结合的时候for循环会出现陷阱:
procs = []
for n in [1, 2, 3] do
procs << Proc.new {puts "#{n}"}
end
[1,2,3].each do |m|
procs << Proc.new {puts "#{m}"}
end
procs.each { |p| p.call }
#结果:
#3
#3
#3
#1
#2
#3
很显然for的结果出乎我们意料之外。
3.for是用each实现的,并且会在each的scope外创建临时变量。
a=[1,2,3]
def a.each
puts "call each!"
end
for i in a
puts i
end
#结果:
#call each!
4.for循环的速度比each快一点点:
require 'benchmark'
include Benchmark
n = 500000
array=(1..n).to_a
tmp=nil
Benchmark.benchmark(" "*7 + CAPTION, 7, FMTSTR) do |x|
tf = x.report("for:") { for i in array; tmp=i; end }
tt = x.report("each:") { array.each do |j| ; tmp=j; end }
end
#结果:
user system total real
for: 0.172000 0.000000 0.172000 ( 0.172000)
each: 0.234000 0.000000 0.234000 ( 0.234000)