array_object.uniq.each 连锁 Ruby

array_object.uniq.each chain Ruby

在下面的代码中我得到了预期的结果:

(我正在进行的学习练习的重点是编写代码来修改原始数组而不是 return 创建一个新数组)

def filter_out!(array, &prc)
    array.uniq.each { |el| array.delete(el) if prc.call(el) } #my block of code
end

arr_2 = [11, 17, 13, 15 ]
filter_out!(arr_2) { |x| x.odd? }
p arr_2     # []

但是,如果我删除 .uniq 并仅使用 array.each,输出将更改为 [17, 15]

我认为不同之处在于,当仅使用 array.each 索引时,索引正在循环,当在零索引处删除 11(因为它是奇数)时,它会查看下一个索引,1,但是 17不再位于该索引处(现在是 13),因此跳过该元素以针对该块进行测试。 15 也一样,这就是为什么它和 17 仍然存在的原因。

我的假设正确吗?如果是这样,.uniq 的基础功能如何绕过它?我假设在 .each 之前链接 .uniq 会简单地 return 与 [17, 15] 相同的 'incorrect answer' 因为所有值都已经是唯一的并且 .each 会再次在 [11, 17, 13, 15 ] .

上执行

Is my assumption correct?

是的。

How does the underlying functionality of .uniq bypass this?

因为调用此方法 returns 一个 NEW OBJECT,所以您不再改变正在迭代的对象。

# Your object_ids will be different!
arr_2.object_id
  #=> 70302248117520

arr_2.uniq.object_id
  #=> 70302210605760