DevCN
菜单
全部文章快讯开发深度热点

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;空时长集合有效条数为零,总和也为零。计数规则和时长统计彼此独立,不能用其中一个结果推断另一个。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。