2017-03-02 100 views
0

我試圖在Ruby中執行此代碼:爲什麼'每個'迭代器都不通過整個數組?

array=[1,2,3,4,5] 
array.each do |x| 
    puts array.length 
    puts "Downloading #{array.length} files" 
    array.pop 
end 

我:

5 
Downloading 5 files 
4 
Downloading 4 files 
3 
Downloading 3 files 

我不明白爲什麼我只得到三個迭代。我做錯了什麼(除了不使用while循環)?

+4

迭代時不要改變枚舉值。這個問題在這裏回答了數十萬次。 – mudasobwa

+0

相關問題:[更改.each循環中引用的數組元素的值?](http://stackoverflow.com/q/5646710/2620080) –

+0

如果您提供了有關您需要的解釋,我們可能會爲您提供不同的解決方案。 –

回答

1

是這樣發生了什麼事之前:

  1. array.length是5
  2. X = 1正在處理
  3. array.shift(array.length 4)
  4. 數組長度= 4
  5. x = 2正在處理中
  6. array.shift(array.length是3)
  7. X = 3正在處理
  8. array.shift(array.length是2時)

現在沒有更多的陣列項遍歷,因爲最後3項(3,4,5)彈出。

一個更好的辦法做的是扭轉陣列倒騰它

array=[1,2,3,4,5] 

array.reverse.each do |x| 
    puts array.length 
    puts "Downloading #{array.length} files" 
    array.shift 
end 

現在是什麼情況,該陣列現在[5,4,3,2,1]。 每個循環處理數組中的第一個項目,放入數組長度,然後使用shift刪除該值。

+1

謝謝!這是我希望得到的幫助! – xyzmg

0

這是因爲你遍歷從開始的array這意味着:

1 step: puts array[0] and you delete array[4] element(array => [1, 2, 3, 4]) 
2 step: puts array[1] and delete array[3] element(array => [1, 2, 3]) 

如果你想刪除的每個元素之後返回它,你可以在許多變種做到這一點,它的一些:

array.reverse.each do |x| 
    puts "Downloading #{x} files" 
    array.pop 
end 

array.size.times do 
    puts "Downloading #{array.pop} files" 
end 

如果你不想得到空array船尾呃本次迭代,你可以:

array.reverse.each do |x| 
    puts "Downloading #{x} files" 
end 
+0

謝謝你的幫助。 – xyzmg

0

在你的函數中,array.pop正在減少你的數組長度。在最後一行

3 
Downloading 3 files 

您的數組的長度爲3,您每個循環已經運行3次。這就是爲什麼它不會迭代下一個元素。 (在這裏,每個循環只迭代3個元素,因爲你的數組長度是3)

相關問題