2016-10-22 118 views
0

阵列考虑摘录:修改期间迭代

a = [1, 2, 3, 4, 5] 
a.each { |e| a.shift ; p e ; p a } 

输出:

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

它揭示的each实施中以指数形式完成(1是在位置上的元素0打印时,31打印时的元素,而5是打印时位置2上的元素)。

另一种方法是打印1,2,3

这是行为的目的?或者它只是实现细节,并且有可能重新实现Array的某一天,并且此行为可能会更改?

+2

当你从你正在枚举的集合中移除元素时,会发生这种事情。相反,'a.dup.each {| e |转变 ; p e; p1}'print'“1 \ n [2,3,4,5 \ n2 \ n [3,4,5] \ n3 \ n [4,5] \ n4 \ n [5]”'。 。 –

回答

0

是的,这是一个众所周知的行为。

这是可能的行为是由于执行的原因,即,效率等

但它是否只是实现细节并没有太大的意义。 Ruby开发人员担心不会破坏向后兼容性,这种基本行为不太可能会被改变。即使他们继续下去,他们也会有相当长的过渡期。

无论如何,从可读性的角度来看,在迭代过程中修改数组通常是不好的。在相关情况下,您可能应该复制数组。

+0

他们非常担心向后兼容众所周知的行为,但是有这样的边缘情况?你是对的,不是真的。 – tadman