array.map的不直观行为

时间:2017-05-13 05:30:52

标签: arrays ruby

所以这种行为似乎是合乎逻辑的

> array = (1..4).to_a
=> [1, 2, 3, 4]
> array.map {|a| [array.delete(array.first), array.delete(array.last)]}
=> [[1, 4], [2, 3]]
> array
=> []

但是当我们增加范围时,它不起作用:

> array = (1..6).to_a
=> [1, 2, 3, 4, 5, 6]
> array.map {|a| [array.delete(array.first), array.delete(array.last)]}
=> [[1, 6], [2, 5]]
> array
=> [3, 4]

它使用奇数进行相同的奇怪行为:

> array = (1..9).to_a
 => [1, 2, 3, 4, 5, 6, 7, 8, 9]
> array.map {|a| [array.delete(array.first), array.delete(array.last)]}
 => [[1, 9], [2, 8], [3, 7]]
> array
 => [4, 5, 6] 

这不是我们的预期,为什么它会这样?

1 个答案:

答案 0 :(得分:1)

这是猜测,因为我不确定这是否是确切的情况,但我不能将此作为评论。

让我们一步一步走:

你定义了一个数组:

> array = (1..6).to_a
 => [1, 2, 3, 4, 5, 6]

现在定义了一个迭代器:

array.map {|a| [array.delete(array.first), array.delete(array.last)]}

因此,对于第一次迭代,它将array[0]作为变量a的值并执行操作,从而删除数组的firstlast元素。 / p>

首次迭代后,array变为[2,3,4,5]

对于第二次迭代,它将array[1]作为变量a的值,并在第一次迭代中执行相同操作并删除第一个和最后一个元素。现在array[3,4]

现在进行第3次迭代,如果你的原始数组只有2的大小,就像[2,3]一样,但是因为你在迭代过程中修改了原始数组所以它会尝试第3次迭代,所以它不会尝试第3次迭代数组的长度为6

对于第3次迭代,它需要数组的第三个元素,即array[2],但是您当前的数组没有该索引,因此它返回剩余的数组而没有任何其他操作。

在迭代时修改数组真的很混乱。