訪問值

使用 [][]= 方法讀取和寫入雜湊的各個值:

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