2014-09-22 50 views
0
array=['red', 'green', 'blue', 'purple'] 
array.each do | color | 
    puts(color) 
    if color == 'green' 
    array.delete(color) 
    end 
end 

这打印红色,绿色,紫色。我明白,array.delete混淆迭代,但我的问题是为什么以及如何?引擎盖背后发生了什么?如果我将数组替换为array.delete(color),例如数组< <'white',则将打印所有颜色,因此只有当从数组中删除项时才会出现此行为。为什么Array#删除跳过“蓝色”并在删除“绿色”时打印“绿色”?

回答

1

在您的原始array,​​是1索引。因此,在第二次迭代中,虽然if表达式的计算结果为true,但您将从原始array中删除实际条目​​。因此blue进入索引1。这就是为什么在第三次迭代中,3 rd元素是purple,这就是您如何从预期输出中缺少"blue"的原因。

可以如下对其进行调试: -

array=['red', 'green', 'blue', 'purple'] 
array.each do | color | 
    if color == 'green' 
    array.delete(color) 
    end 
    # printing array to debug the actual array content after each iteration 
    p array 
end 
# >> ["red", "green", "blue", "purple"] 
# >> ["red", "blue", "purple"] 
# >> ["red", "blue", "purple"] 
0

你迭代之前发生变异的阵列和动态的循环中改变你的索引。例如:

array = %w[red green blue purple] 
array.delete 'green' 
array.each { |color| puts color } 

此正确地产生:

$ ruby colors.rb 
red 
blue 
purple 
相关问题