Z
ZHANK
集合与枚举

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 会死循环!