Ruby 哈希 Hash
Hash 用来保存键值对。它适合表示配置、用户属性、统计结果、JSON-like 数据等。
创建 Hash
常见写法:
user = {
name: "Alice",
age: 18,
admin: false
}
这里的键是 Symbol,name: "Alice" 等价于 :name => "Alice"。
也可以使用字符串键:
user = {
"name" => "Alice",
"age" => 18
}
两种键不要随意混用。
读取值
user = { name: "Alice", age: 18 }
puts user[:name]
puts user[:email]
不存在的键默认返回 nil。
如果你希望键不存在时明确报错,可以用 fetch:
puts user.fetch(:name)
puts user.fetch(:email, "unknown")
写入和更新
user[:age] = 19
user[:city] = "Shanghai"
Hash 可以动态增加键值对。
遍历 Hash
user.each do |key, value|
puts "#{key}: #{value}"
end
获取所有键和值:
puts user.keys.inspect
puts user.values.inspect
默认值
counts = Hash.new(0)
counts[:error] += 1
counts[:warn] += 1
puts counts
Hash.new(0) 表示读取不存在的键时返回 0。
注意
如果默认值是数组或哈希这类可变对象,要特别小心 Hash.new([])。多个键可能共享同一个默认对象。遇到这种情况,应使用 block 形式。
安全写法:
groups = Hash.new { |hash, key| hash[key] = [] }
groups[:a] << 1
groups[:b] << 2
常见错误
混用字符串键和 Symbol 键:
user = { name: "Alice" }
puts user["name"] # nil
忘记处理缺失键:
email = user[:email]
# email.downcase 可能报错,因为 email 是 nil
小练习
- 创建一个保存设备信息的 Hash,包括
id、type、online。 - 使用
fetch读取一个可能不存在的键,并设置默认值。 - 使用 Hash 统计数组中每个单词出现次数。
小结
Hash 是 Ruby 表达结构化数据的核心工具。你要掌握 Symbol 键、fetch、遍历、默认值,并避免字符串键和 Symbol 键混用。