为 Hash.new 设置默认值
本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 33 课,共 56 课。
默认情况下,在哈希中查找不存在的键会返回 nil:
scores = {}
puts scores["Alice"] # nilHash.new(default) 会改变这一点。每个缺失的键都会返回你传入的值:
scores = Hash.new(0)
puts scores["Alice"] # 0这是编写计数器最简洁的方式。递增之前,你不需要检查 if scores[name].nil?:
counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
counts[letter] += 1
end
puts counts.inspect # {"a"=>3, "b"=>1, "c"=>1}重要:Hash.new(0) 会将默认值设为 0,但读取键时不会存储该键。赋值之前,哈希表会保持为空。因此,一旦你写下 counts[letter] += 1,键就会以新值添加。
挑战
简单读取一个以逗号分隔的 category:amount 条目列表(例如 food:12,gas:30,food:8,books:25,gas:15)。使用 Hash.new(0) 创建一个按类别统计总额的哈希,然后只打印总额至少为 20 的类别,每行一个,并按总额降序排列:
<category>: <total>对于上面的示例输入,输出为:
gas: 45
books: 25
food: 20如果没有类别达到 20,则不打印任何内容。
亲手试试
entries = gets.chomp.split(",")
# TODO:totals = Hash.new(0);按类别累加 amount;
# 然后按 total 降序排序,输出 total >= 20 的类别
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器