2017-03-02 98 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)

相关问题