考虑摘录:
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
打印时的元素,3
是1
的元素{1}}打印时,5
是打印时位置2
的元素。)
另一种方法是打印1
,2
,3
。
这种行为是否有意?或者它只是实现细节,有可能某天Array
重新实现,这种行为可能会改变?
答案 0 :(得分:0)
是的,这是众所周知的行为。
这种行为很可能是由于实施原因,即效率等原因造成的。
但是否只是实施细节并没有多大意义。 Ruby开发人员担心不会破坏向后兼容性,并且这种基本行为不太可能被改变。即使他们继续下去,他们也会有相当长的过渡期。
无论如何,从可读性的角度来看,在迭代期间修改数组通常是不好的。在相关情况下,您可能应该复制数组。