来自Ruby Koans about_hashes.rb
:
为什么在访问哈希键时可能要使用#fetch
而不是#[]
?
答案 0 :(得分:133)
默认情况下,使用#[]
将检索哈希值(如果存在),如果哈希值不存在,则返回nil *。
使用#fetch
为您提供了一些选项(请参阅#fetch上的文档):
fetch(key_name)
:如果密钥存在,则获取值,如果密钥不存在,则引发KeyError
fetch(key_name, default_value)
:如果密钥存在,则获取值,否则返回default_value
fetch(key_name) { |key| "default" }
:如果密钥存在,则获取值,否则运行提供的块并返回值。每个应该根据情况需要使用,但#fetch
功能非常丰富,可以处理许多情况,具体取决于它的使用方式。出于这个原因,我倾向于使用#[]
来访问密钥。
*正如Marc-AndréLafortune所说,使用#[]
访问密钥会调用#default_proc
(如果存在),或者返回#default
,默认为nil
。有关详细信息,请参阅the doc entry for ::new
。
答案 1 :(得分:22)
使用[]
时,哈希的创建者会控制当密钥不存在时会发生什么,而fetch
就是这样。
答案 2 :(得分:6)
fetch
会在找不到密钥时引发错误。您可以改为提供默认值。
h = {}
h.fetch(:foo) # no default value, raises error
# => # ~> -:3:in `fetch': key not found: :foo (KeyError)
h.fetch(:bar, 10) # default value, returns default value
# => 10