锁定老帖子 主题:慎用for循环
精华帖 (0) :: 良好帖 (5) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-05
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) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-05
受教了,原来还有这样的细微差别呢。
4.为什么for比each快些呢? |
|
返回顶楼 | |
发表时间:2009-05-05
sofire 写道 受教了,原来还有这样的细微差别呢。 4.为什么for比each快些呢? 在实际中采用哪种方式好些呐? |
|
返回顶楼 | |
发表时间:2009-05-05
deng131 写道 sofire 写道 受教了,原来还有这样的细微差别呢。
4.为什么for比each快些呢? 在实际中采用哪种方式好些呐? 当然强烈推荐each 并且1.9中 each 中block临时变量可以给同名局部变量进行赋值的特性(bug?)已经除去。 至于性能只是一点细微差别 |
|
返回顶楼 | |
发表时间:2009-05-05
sofire 写道 受教了,原来还有这样的细微差别呢。
4.为什么for比each快些呢? 这个我也不清楚,但是for和each的区别就是在创建变量的方式,我感觉速度差别也是由这个引起的。 |
|
返回顶楼 | |
发表时间:2009-05-05
参看,右上角相关文章,第一条
关于第二点,加一行,就可以理解了 procs = [] for n in [1, 2, 3] do procs << Proc.new {puts n} end n = 4 [1,2,3].each do |m| procs << Proc.new {puts m } end procs.each { |p| p.call } |
|
返回顶楼 | |
发表时间:2009-05-05
each 是人民群众喜闻乐见的吊尾 proc,风格归一,行为清楚。
但也正因为 each 是 proc 语法,受 proc 限制。 for in 不是 proc 语法,所以实现上能优化多一点。 我觉得优化瓶颈的时候可以考虑 for,其它时候肯定是 each 好。 http://www.ruby-doc.org/core/classes/Benchmark.html |
|
返回顶楼 | |
发表时间:2009-05-06
|
|
返回顶楼 | |
发表时间:2009-05-06
引用 .在和Proc结合的时候for循环会出现陷阱: 这是个什么原理? |
|
返回顶楼 | |
发表时间:2009-05-07
wosmvp 写道 参看,右上角相关文章,第一条
关于第二点,加一行,就可以理解了 procs = [] for n in [1, 2, 3] do procs << Proc.new {puts n} end n = 4 [1,2,3].each do |m| procs << Proc.new {puts m } end procs.each { |p| p.call } 这么说for和while一样都不是一个scope了。 ps:你是想加 m=4吧? |
|
返回顶楼 | |