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