访问值
使用 []
和 []=
方法读取和写入散列的各个值:
my_hash = { length: 4, width: 5 }
my_hash[:length] #=> => 4
my_hash[:height] = 9
my_hash #=> {:length => 4, :width => 5, :height => 9 }
默认情况下,访问尚未添加到散列的键返回 nil
,这意味着尝试查找键的值始终是安全的:
my_hash = {}
my_hash[:age] # => nil
哈希还可以包含字符串中的键。如果你尝试正常访问它们,它将只返回 nil
,而不是通过其字符串键访问它们:
my_hash = { "name" => "user" }
my_hash[:name] # => nil
my_hash["name"] # => user
对于期望或需要存在键的情况,哈希具有 fetch
方法,当访问不存在的键时会引发异常:
my_hash = {}
my_hash.fetch(:age) #=> KeyError: key not found: :age
fetch
接受一个默认值作为其第二个参数,如果之前未设置该键,则返回该参数:
my_hash = {}
my_hash.fetch(:age, 45) #=> => 45
fetch
也可以接受一个块,如果以前没有设置该键,则返回该块:
my_hash = {}
my_hash.fetch(:age) { 21 } #=> 21
my_hash.fetch(:age) do |k|
puts "Could not find #{k}"
end
#=> Could not find age
哈希还支持 store
方法作为 []=
的别名:
my_hash = {}
my_hash.store(:age, 45)
my_hash #=> { :age => 45 }
你还可以使用 values
方法获取哈希的所有值:
my_hash = { length: 4, width: 5 }
my_hash.values #=> [4, 5]
注意:这仅适用于 Ruby 2.3+ #dig
对于嵌套的 Hash
s 非常方便。通过在每一步调用 dig 来提取由 idx 对象序列指定的嵌套值,如果任何中间步骤为 nil,则返回 nil。
h = { foo: {bar: {baz: 1}}}
h.dig(:foo, :bar, :baz) # => 1
h.dig(:foo, :zot, :xyz) # => nil
g = { foo: [10, 11, 12] }
g.dig(:foo, 1) # => 11