Ruby 入门:用 Enumerable 与哈希统计记录
用 select、sum 与哈希默认值统计时长和标签,理解块参数、缺失键及稳定输出顺序。
本节目标
用 select、sum 与哈希默认值统计时长和标签,理解块参数、缺失键及稳定输出顺序。
环境与运行方法
使用 Ruby 3.x 或更新版本,保存为 lesson.rb,执行 ruby -c lesson.rb 后运行 ruby lesson.rb。不依赖 Rails 或外部 gem。
核心思路
Enumerable 提供统一的集合处理方式。select 保留符合条件的元素,sum 对数值求和,Hash.new(0) 为尚不存在的计数提供零。示例将零分钟视为有效记录。
完整示例
minutes = [20, -5, 35, 0]
valid = minutes.select { |value| value >= 0 }
puts "valid=#{valid.length} total=#{valid.sum}"
counts = Hash.new(0)
["ruby", "cli", "ruby"].each { |tag| counts[tag] += 1 }
counts.keys.sort.each { |tag| puts "#{tag}=#{counts[tag]}" }预期输出
valid=3 total=55
cli=1
ruby=2逐步理解
竖线之间是块参数,select 返回新数组,不会删除原数组中的负数。标签输出前先排序键,结果就不依赖标签第一次出现的顺序。
整数零作为默认值不会像共享可变数组那样产生别名问题。若需要为每个键创建独立列表,应使用创建新数组的块形式,不能让所有缺失键共享同一个数组。默认值设计必须考虑对象能否被修改。
常见问题与边界
- Ruby 中零是真值。
- 字符串键与符号键不是同一键。
- 带感叹号的方法可能有不同修改语义,需要阅读实际契约。
动手练习
增加一个 cli,并把时长数组清空。
参考答案
两个标签计数均为 2;空时长集合有效条数为零,总和也为零。计数规则和时长统计彼此独立,不能用其中一个结果推断另一个。
文章回复
0 条公开回复