array_object.uniq.each chain ruby

qcbq4gxm  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(353)

在下面的代码中,我得到了预期的结果:
(我正在进行的学习练习的重点是编写代码来修改原始数组,而不是返回新数组)

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),因此跳过元素以针对块进行测试。这就是为什么它和17保持不变的原因。
我的假设正确吗?如果是的话,它的底层功能是如何实现的 .uniq 绕过这个?我想是锁链 .uniq 在以前 .each 只会返回相同的“错误答案” [17, 15] 因为所有的值都是唯一的并且 .each 将再次在 [11, 17, 13, 15 ] .

6kkfgxo0

6kkfgxo01#

我的假设正确吗?

.uniq的底层功能如何绕过这个问题?
因为调用此方法会返回一个新对象,所以您不再对正在迭代的对象进行变异。


# Your object_ids will be different!

arr_2.object_id
  #=> 70302248117520

arr_2.uniq.object_id
  #=> 70302210605760

相关问题