访问值

使用 [][]= 方法读取和写入散列的各个值:

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 对于嵌套的 Hashs 非常方便。通过在每一步调用 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