在迭代期间修改数组

时间:2016-10-22 02:23:32

标签: arrays ruby iteration immutability

考虑摘录:

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的元素{1}}打印时,5是打印时位置2的元素。)

另一种方法是打印123

这种行为是否有意?或者它只是实现细节,有可能某天Array重新实现,这种行为可能会改变?

1 个答案:

答案 0 :(得分:0)

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

这种行为很可能是由于实施原因,即效率等原因造成的。

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

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