http://www.letrails.cn/archives/difference-between-for-loop-and-each/
上看到
for和each的区别主要在于:
for是通过调用each实现,因此for更慢一些
for会在each的scope之外创建一个局部变量,这在某些情况下会引发问题
关于第二点,下面的代码可以很好的说明这个问题:
irb> [1, 2, 3].each do |m| puts m end
irb> puts m
NameError: undefined local variable or method `m' for main:Object
irb> for n in [1, 2, 3] do puts n; end
irb> puts n
=> 3
如果你不了解这一点,那么在某些特殊的情况下,你可能会遇到麻烦,Ruby Forum的某个用户提交的一段代码很好的说明了for可能引发的问题:
a = []
for n in [1, 2, 3] do
a << Proc.new {puts "#{n}"}
end
[1,2,3].each do |m|
a << Proc.new {puts "#{m}"}
end
a.each { |p| p.call }
运行结果:
3
3
3
1
2
3
很显然,for循环的结果不是我们所期待的,因此,结论就是:应该尽可能的使用each替代for循环。
更新:应该使用each代替for的真正原因是,for实际上是通过each实现的,但它在each的scope外面定义了一个同名变量,下面的代码可以说明问题:
>> a = “1\n2\n”
>> def a.each
>> yield(1)
>> end
>> for i in a
>> puts i
>> end
1
=> nil
也就是说“for i in [1, 2]”就相当于“i = nil;[1,2].each do |i|”,因此前面的结论是不正确的,for应该比each慢(没有进行过测试),这才是for真正的问题所在。
分享到:
相关推荐
VB For each循环实例 VB For each循环实例
for_each 返回值实例详解;
jdk1.5以上版本中新增加的特性描述,带有代码例子让你很清晰的明白jdk的 常量 、枚举、 for each、反射等各种新的特性,相信需要的你,一定满足。
for_each遍历vector vector中可以是基本类型(int,double,char,string) 也可以是类类型
houdini fft 使用三层for each结构 以及for 问题
for each in是作为E4X标准的一部分在javascript 1.6中发布的,而它不是ECMAScript标准的一部分。 这将意味着存在各种浏览器的兼容性问题。for each in,对很多浏览器都不支持的。例如是不支持IE6,IE7,IE8等...
之前听说火狐的JS引擎支持for each in的语法,例如下述的代码: 代码如下:var arr = [10,20,30,40,50];for each(var k in arr)console.log(k); 即可直接遍历出arr数组的内容。 由于只有FireFox才支持,所以几乎...
Iterate a function on each entry of a directory for Linux.
java 3d api for a cube with 3d dimension as we know it s most difficult to learn, so i have this code for help each other.
jdk1.5新特性,泛型,for:each
STL算法(for_each/transform)
MATLAB工具箱大全-将多重循环转为单重循环-For-Each
In digital modulation techniques, a set of basis functions are chosen for a particular modulation scheme. Generally the basis functions are orthogonal to each other. Basis functions can be derived ...
For 和 Foreach 的效率问题,先猜一下,再运行一下,看猜的对不对。
之前听说火狐的JS引擎支持for each in的语法,例如下述的代码: 代码如下:var arr = [10,20,30,40,50];for each(var k in arr) console.log(k);即可直接遍历出arr数组的内容。 由于只有FireFox才支持,所以几乎所有...
for each x in rs.Fields response.write("<th>" & ucase(x.name) & "</th>") next %> 'show the values of the MID column and create a button for the MID column for each x in rs.Fields if x.name="MID...
jQuery的each()方法详细介绍