for循环与each的区别
for循环与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循环。
更新:感谢ShiningRay,应该使用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真正的问题所在。
摘自:letrails。cn
作者:
fandyst
出处: http://www.cnblogs.com/todototry/
关注语言: python、javascript(node.js)、objective-C、java、R、C++
兴趣点: 互联网、大数据技术、大数据IO瓶颈、col-oriented DB、Key-Value DB、数据挖掘、模式识别、deep learning、开发与成本管理
产品:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处: http://www.cnblogs.com/todototry/
关注语言: python、javascript(node.js)、objective-C、java、R、C++
兴趣点: 互联网、大数据技术、大数据IO瓶颈、col-oriented DB、Key-Value DB、数据挖掘、模式识别、deep learning、开发与成本管理
产品:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。