来自 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