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
在下面的代码中我得到了预期的结果:
(我正在进行的学习练习的重点是编写代码来修改原始数组而不是 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