来自 Ruby Koans about_hashes.rb
:
为什么要在访问哈希键时使用#fetch
而不是使用?#[]
默认情况下,如果哈希值存在,using#[]
将检索哈希值,如果不存在则返回 nil *.
Using#fetch
为您提供了一些选项(请参阅#fetch上的文档):
fetch(key_name)
KeyError
:如果键存在则获取值,如果不存在则引发fetch(key_name, default_value)
: 如果key存在则取值,default_value
否则返回fetch(key_name) { |key| "default" }
:如果键存在则获取值,否则运行提供的块并返回值。每个都应该根据情况需要使用,但#fetch
功能非常丰富,可以根据使用方式处理多种情况。出于这个原因,我倾向于使用它而不是使用#[]
.
* 正如 Marc-André Lafortune 所说,访问带有的密钥#[]
将调用#default_proc
,如果它存在,否则返回#default
,默认为nil
. 有关更多信息,请参阅文档条目。::new
有了[]
,哈希的创建者控制了当一个键不存在时会发生什么,而fetch
你可以做到。
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