for迴圈與each的區別

來源:互聯網
上載者:User
for迴圈與each的區別By YUANYI ZHANG | Published: FEBRUARY 15, 2008

for和each的區別主要在於:

  1. for是通過調用each實現,因此for更慢一些
  2. 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.