【问题标题】:Modifying an array during iteration在迭代期间修改数组
【发布时间】:2017-03-04 10:03:00
【问题描述】:

考虑摘录:

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的元素,@987654328 @ 是打印时位于2 位置的元素。

另一种方法是打印123

这种行为是有意的吗?或者它只是实现细节,有可能有一天Array 被重新实现并且这种行为可能会改变?

【问题讨论】:

  • 当您从要枚举的集合中删除元素时,就会发生这种情况。相比之下,a.dup.each{ |e| a.shift ; p e ; p a } 打印 "1\n[2, 3, 4, 5\n2\n[3, 4, 5]\n3\n[4, 5]\n4\n[5]"。 .

标签: arrays ruby iteration immutability


【解决方案1】:

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

该行为很可能是由于实现原因,即效率等原因。

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

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

【讨论】:

  • 他们相当关心与众所周知的行为的向后兼容性,但是像这样的边缘情况?你是对的,不是真的。
猜你喜欢
  • 2013-01-15
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2019-02-19
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多