Enumerable 模块
map/select/reject/reduce、any?/all?、sort_by、lazy 惰性枚举
Enumerable 模块
Enumerable 是 Ruby 最强大的模块——只要实现 each,自动获得 map/select/reduce 等 50+ 方法。
学完本章你将: 掌握 map/select/reject/reduce、any?/all?、lazy 惰性。
常用方法
ruby
nums = [1, 2, 3, 4, 5]
# 转换
nums.map { |n| n * 2 } # [2, 4, 6, 8, 10]
# 过滤
nums.select { |n| n.even? } # [2, 4]
nums.reject { |n| n.even? } # [1, 3, 5]
# 归约
nums.reduce(0) { |sum, n| sum + n } # 15
nums.reduce(:+) # 15(简写)
nums.sum # 15(Rails/新Ruby)
# 判断
nums.any?(&:even?) # true(存在偶数)
nums.all?(&:positive?) # true(全正数)
nums.none?(&:zero?) # true
# 查找
nums.find { |n| n > 3 } # 4(第一个匹配)
nums.find_all(&:even?) # [2, 4](同 select)
# 分组
nums.partition(&:even?) # [[2,4], [1,3,5]]
nums.group_by { |n| n % 2 } # {1=>[1,3,5], 0=>[2,4]}
lazy 惰性枚举
ruby
# 无限范围 + lazy
squares = (1..Float::INFINITY)
.lazy
.map { |n| n * n }
.select(&:even?)
.first(5)
# [4, 16, 36, 64, 100]
# 没有 lazy 会死循环!