首页 > 解决方案 > array_object.uniq.each 链 Ruby

问题描述

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

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

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绕过这个的?我会假设.uniq之前的链接.each只会返回相同的“不正确答案”,[17, 15]因为所有值都已经是唯一的,并且.each会再次在[11, 17, 13, 15 ] .

标签: rubymethod-chaining

解决方案


我的假设正确吗?

是的。

.uniq 的底层功能如何绕过这个?

因为调用这个方法会返回一个NEW OBJECT,所以你不再改变被迭代的对象。

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

arr_2.uniq.object_id
  #=> 70302210605760

推荐阅读