`
jsntghf
  • 浏览: 2482074 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

for循环与each的区别

 
阅读更多

for和each的区别主要在于:

  1. for是通过调用each实现,因此for更慢一些
  2. for会在each的scope之外创建一个局部变量,这在某些情况下会引发问题

关于第二点,下面的代码可以很好的说明这个问题:

 

    [1, 2, 3].each do |m| puts m end
    puts m # => NameError: undefined local variable or method `m' for main:Object
    for n in [1, 2, 3] do puts n; end
    puts n # => 3

 

如果你不了解这一点,那么在某些特殊的情况下,你可能会遇到麻烦,下面的代码可以很好的说明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循环。

 

"for i in [1, 2]"就相当于"i = nil;[1, 2].each do |i|",这才是for真正的问题所在。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics