`
Hooopo
  • 浏览: 335247 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

慎用for循环

    博客分类:
  • Ruby
阅读更多

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)
 
分享到:
评论
11 楼 Hooopo 2009-06-01  
kulinglei 写道
希望楼主把主题改成:ruby慎用for循环.我被骗了进来

这是发在ruby版的呀。。
当然是说ruby了
10 楼 kulinglei 2009-06-01  
希望楼主把主题改成:ruby慎用for循环.我被骗了进来
9 楼 Hooopo 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吧?
8 楼 wolfplanet 2009-05-06  
引用
.在和Proc结合的时候for循环会出现陷阱:

这是个什么原理?
7 楼 malk 2009-05-06  
   
6 楼 night_stalker 2009-05-05  
each 是人民群众喜闻乐见的吊尾 proc,风格归一,行为清楚。
但也正因为 each 是 proc 语法,受 proc 限制。

for in 不是 proc 语法,所以实现上能优化多一点。

我觉得优化瓶颈的时候可以考虑 for,其它时候肯定是 each 好。

http://www.ruby-doc.org/core/classes/Benchmark.html
5 楼 wosmvp 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 }  
4 楼 Hooopo 2009-05-05  
sofire 写道
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?

这个我也不清楚,但是for和each的区别就是在创建变量的方式,我感觉速度差别也是由这个引起的。
3 楼 Hooopo 2009-05-05  
deng131 写道
sofire 写道
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?

在实际中采用哪种方式好些呐?

当然强烈推荐each
并且1.9中 each 中block临时变量可以给同名局部变量进行赋值的特性(bug?)已经除去。
至于性能只是一点细微差别
2 楼 deng131 2009-05-05  
sofire 写道
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?

在实际中采用哪种方式好些呐?
1 楼 sofire 2009-05-05  
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?

相关推荐

    浅谈js中的in-for循环

    5. **慎用变量`k`**:在循环中,`k`通常是一个字符串,表示属性名。如果在循环外使用`k`,可能会与循环内的属性名冲突,因此最好在循环内使用局部变量。 总结来说,`for...in`循环在JavaScript中是一个强大的工具,...

    Web开发性能优化参考

    2. **慎用eval和Function构造函数**:这些功能强大但执行效率低,可能导致安全问题,应尽量避免。 3. **避免使用with语句**:with会增加作用域链的长度,影响性能。使用变量代替with可以提高代码执行速度。 4. **...

    Java并发编程总结——慎用CAS详解

    一旦获得锁,其他线程就会被阻塞,从而减少了不必要的循环。 二、CAS错误的使用场景 错误使用CAS的一个常见例子是在高并发环境中,当多个线程尝试修改同一个值时,可能导致大量的自旋。在上述的`CASDemo`示例中,...

    零起点学通C++多媒体范例教学代码

    7.2 慎用goto语句 7.3 while语句 7.3.1 带运算符的while语句 7.3.2 以字符为条件的while语句 7.3.3 限定while循环的次数 7.3.4 continue语句 7.3.5 break语句 7.3.6 永不休止的while循环 7.4. do……while循环 7.5 ...

    零起点学通C++学习_多媒体范例教学代码

    7.2 慎用goto语句 7.3 while语句 7.3.1 带运算符的while语句 7.3.2 以字符为条件的while语句 7.3.3 限定while循环的次数 7.3.4 continue语句 7.3.5 break语句 7.3.6 永不休止的while循环 7.4. do……while...

    Android高效编程PPT教学课件.pptx

    8. **慎用增强型For循环**: - 增强的For循环在处理数组时表现良好,但与Iterable对象配合时会额外创建对象,可能影响性能。 9. **避免过度使用枚举**: - 枚举类型会增加类文件大小,并在初始化时创建多个对象,...

    python考试试卷.docx

    慎用小写字母 l 和大写字母 O,因给他们可能被人错看成数字 1 和 0(D)。 三、 Python 组合数据类型 Python 组合数据类型错误的是(D):Python 的 str、tuple 和 list 类型都属于序列类型(A)。Python 组合数据...

    《大学C语言程序设计》实验报告-实验单元一 程序基本结构设计.docx

    - 除了`scanf`和`printf`,C语言还有其他输入输出函数,如`gets`(已过时,慎用)和`puts`等。 8. **选择结构(if和switch语句)**: - `if`语句用于根据条件执行不同的代码块。 - `switch`语句提供了一种更简洁...

    Android内存管理小结

    - **慎用增强型for循环**:在某些情况下,传统的for循环可能比增强型for循环更高效。 - **避免使用枚举类型**:枚举类型可能会带来额外的开销,尤其是在性能敏感的应用中。 - **使用内联类**:内联类可以减少内存...

    注射用乌司他丁说明书.doc

    - 有药物过敏史、对食物过敏者或过敏体质患者慎用。 - 本品用于急性循环衰竭时,不能替代一般的休克疗法(如输液、吸氧、外科处理、抗生素治疗等),症状改善后应停止给药。 - 使用时需注意:本品溶解后应尽快使用。...

    编程的修养1、有专研精神,勤学善问、举一反三。

    - **使用for循环**:根据情况选择for或while,for循环通常更适合计数循环。 - **sizeof操作符**:使用sizeof获取类型而非变量的大小,避免意外的字节对齐问题。 - **处理警告**:不要忽略编译警告,它们可能是潜在...

    前端第二阶段笔记( JavaScript )

    然而,递归方法使用时需要注意,递归深度过大可能会导致栈溢出或性能问题,因此在处理大规模数据时要慎用。 最后,笔记还提到了JavaScript数组的两个方法`join`和`split`。这两个方法常用于字符串和数组之间的转换...

    IBM的sql开发规范

    - **慎用DISTINCT**:它会增加计算量,若非必要,尽量避免。 - **谨慎使用UNION**:如果可能,使用UNION ALL以减少排序操作,但要注意可能会引入重复记录。 - **获取最新数据**:优先使用聚合函数而非排序,比如...

    高质量CC++编程(完整)

    第4章讲解了表达式和基本语句的使用,如运算符优先级、复合表达式、条件语句(IF)、循环语句的效率、FOR循环的控制变量、SWITCH语句以及GOTO语句的慎用。这部分内容强调了清晰和高效的代码逻辑。 第5章探讨了常量...

    上海贝尔高质量C++编程指南

    在表达式和基本语句章节,书中深入探讨了运算符优先级、复合表达式的构建原则、if语句的不同形式、循环语句的效率问题、for循环控制变量的管理、switch语句的使用场景以及goto语句的慎用。通过这些细节的讲解,帮助...

    突破程序员基本功的16课.part2

    5.5.1 慎用字符的Unicode转义形式 5.5.2 中止行注释的转义字符 5.6 泛型可能引起的错误 5.6.1 原始类型变量的赋值 5.6.2 原始类型带来的擦除 5.6.3 创建泛型数组的陷阱 5.7 正则表达式的陷阱 5.8 多线程的...

    高质量C++编程(完整).doc

    第4章涉及表达式和基本语句,如运算符优先级、复合表达式、条件语句(IF)、循环效率、FOR语句的循环变量管理、SWITCH语句和GOTO语句的慎用,这些都是编写高效和易于理解代码的关键。 第5章阐述了常量的使用,包括...

    高质量 C++C 编程指南

    第4章涉及表达式和基本语句的使用,如运算符优先级、复合表达式、IF语句、循环语句的效率、FOR语句中的循环控制变量、SWITCH语句以及GOTO语句的慎用,这些都是编写高效、无误代码的基础。 第5章介绍了常量的使用,...

    高质量C++/C编程指南

    第四章涉及表达式和基本语句,包括运算符优先级、复合表达式、IF语句、高效循环语句、FOR语句的循环控制变量、SWITCH语句的使用以及GOTO语句的慎用,这些都是编程中基础但至关重要的概念。 第五章讲解了常量的使用...

Global site tag (gtag.js) - Google Analytics