ruby - 为什么 uniq 在 Ruby 中映射后返回数组的原始值?

标签 ruby

我尝试了以下代码:

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/

相关文章:

ruby-on-rails - 在 Ruby 中使用注入(inject)?

ruby-on-rails - 是否有比蛮力更聪明的 Ruby 算法来查找多维数据中的相关性?

ruby - 反转整数数字

ruby -::(双冒号)在 Ruby 中是什么意思?

ruby-on-rails - 将单个记录合并到事件记录关系中

MySQL gem 安装问题

ruby - 两个字符串的正则表达式格式

ruby-on-rails - 尽管手动请求工作正常,但无法使用 yt gem 读取标题

arrays - 为什么 Ruby 的 each_with_object 会将附加有 += 运算符的数据删除到数组备忘录中?

ruby-on-rails - 使用 geokit 或其他 ruby​​ gem 计算一系列地理坐标的中心