Ruby在迭代时删除数组元素

Ruby在迭代时删除数组元素,ruby,Ruby,通过运行上述代码,我得到以下输出: a = ['red', 'green', 'blue', 'purple'] a.each do |e| puts e if e == 'green' a.delete(e) end end 有人能给我解释一下幕后发生了什么吗?这是每个 red green purple 为了补充Sergio的解释,更惯用的修改数组的方法是: v red green blue purple # print red # next v red g

通过运行上述代码,我得到以下输出:

a = ['red', 'green', 'blue', 'purple']

a.each do |e|
 puts e
 if e == 'green'
  a.delete(e)
 end
end

有人能给我解释一下幕后发生了什么吗?

这是
每个

red
green
purple

为了补充Sergio的解释,更惯用的修改数组的方法是:

 v
red green blue purple  # print red

# next

      v
red green blue purple # print green

     v
red blue purple # delete green in the same iteration

# next

           v
red blue purple # print purple
因此:


不,你应该得到“红、蓝、紫”。您使用的ruby版本是什么?我使用的是ruby 2.3.3p222。无论如何,我删除了看跌期权之后的内容,所以“绿色”应该以任何方式打印出来。我想知道“蓝色”是如何被跳过的?是的,你是对的。甚至在块完成执行之前就进行了转换?实际上,我无法理解本机代码:(你能写一个伪代码吗?@AkashCP在
delete
返回之前进行转换,是的。
 v
red green blue purple  # print red

# next

      v
red green blue purple # print green

     v
red blue purple # delete green in the same iteration

# next

           v
red blue purple # print purple
a = ['red', 'green', 'blue', 'purple']
a.reject! do |e|
  puts e
  e == 'green'
end
2.2.5 :001 >     a = ['red', 'green', 'blue', 'purple']
 => ["red", "green", "blue", "purple"] 
2.2.5 :002 >     a.reject! do |e|
2.2.5 :003 >           puts e
2.2.5 :004?>         e == 'green'
2.2.5 :005?>       end
red
green
blue
purple
 => ["red", "blue", "purple"] 
2.2.5 :006 >