在使用哈希函数时获取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