慎用for循环

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)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值