在下面的代码中,我得到了预期的结果:
(我正在进行的学习练习的重点是编写代码来修改原始数组,而不是返回新数组)
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 ]
.
1条答案
按热度按时间6kkfgxo01#
我的假设正确吗?
对
.uniq的底层功能如何绕过这个问题?
因为调用此方法会返回一个新对象,所以您不再对正在迭代的对象进行变异。