我尝试了以下代码:
numbers = [1,2,2,3,4]
numbers.map.uniq {|number| number < 2 }
我的理解是map
的返回值传递给了uniq
。我预计:
[true, false]
相反,我收到了:
[1, 2]
uniq
似乎维护了对原始数组的引用。
有人可以深入了解这种行为吗?
最佳答案
Array#uniq
接受一个 block ,定义应该处理什么的条件 uniq
。
main > numbers = [1,2,2,3,4].map
#⇒ #<Enumerator: ...>
main > numbers.uniq
#⇒ [1, 2, 3, 4]
# effectively the same as
main > numbers.to_a.uniq
#⇒ [1, 2, 3, 4]
main > numbers.uniq { |number| number.odd? }
#⇒ [1, 2]
后者返回一个奇数和一个非奇数(偶数)元素。在您的情况下,它返回 1 个小于 2 的元素和一个大于或等于 2 的元素。
请注意,map
枚举器实际上在那里:
numbers.each &Math.method(:sqrt)
#⇒ [1.0, 1.4142135623730951, 1.4142135623730951,
# 1.7320508075688772, 2.0]
关于ruby - 为什么 uniq 在 Ruby 中映射后返回数组的原始值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55243471/