ruby - 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 ]
.
解决方案
我的假设正确吗?
是的。
.uniq 的底层功能如何绕过这个?
因为调用这个方法会返回一个NEW OBJECT,所以你不再改变被迭代的对象。
# Your object_ids will be different!
arr_2.object_id
#=> 70302248117520
arr_2.uniq.object_id
#=> 70302210605760
推荐阅读
- windows-10 - Folder Redirection and sync center synchronizing old and new server
- ios - 如何在 Swift 的特定时区获取日期的本地化字符串?
- python - 我应该将预测回归模型拟合到平滑数据吗?
- python-3.x - 不规则张量上的 Tensorflow tf.map_fn 失败,“RaggedTensor”类型的对象没有 len
- setup-project - 非管理员的 Window Installer 自定义操作失败
- c# - 是否可以将 MenuItem.IsEnabled 属性绑定到不同的上下文?
- javascript - 等宽字符的精确宽度
- vue.js - 如何在 Vue 编辑器中将组件呈现为自定义标签?
- vba - MS-Access Form Visible 属性不一致
- r - 从两个变量创建数字以查找合并症