为什么ruby中的循环。只运行了一半?

时间:2016-02-22 08:13:47

标签: ruby loops

使用此循环时出现问题:

a = [1,2,3,4]
a.each{puts "#{a.shift}"}

a我刚拿到1,2。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:5)

Array#shift从数组中删除第一个值并返回它。因此,当您循环遍历数组时,数组将被修改。

each方法似乎基本上循环,直到索引大于或等于数组的长度。因为您在循环时从数组中删除元素,所以数组的长度会减小。当你删除了两个元素时,索引是2,长度是2,所以.each循环退出。

即:

Index: 0
Array: [1, 2, 3, 4]
Print: 1

Index: 1
Array: [2, 3, 4]
Print: 2

Index: 2 # Exit here
Array: [3, 4]

答案 1 :(得分:1)

Array#shift修改一个数组。可以迭代并打印值,或者使用循环,除非变异数组为空:

a.each { |elem| puts elem }
#⇒ a is still [1,2,3,4]

while a.size > 0 do puts a.shift end
#⇒ a is empty []

until a.empty? do puts a.shift end
#⇒ a is empty []

在您的示例中,a发生了变异,因此在第三次迭代时,没有更多要迭代的元素。