85

来自 Ruby Koans about_hashes.rb

为什么要在访问哈希键时使用#fetch而不是使用?#[]

4

3 回答 3

164

默认情况下,如果哈希值存在,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

于 2013-05-15T15:45:03.177 回答
31

有了[],哈希的创建者控制了当一个键不存在时会发生什么,而fetch你可以做到。

于 2013-05-15T16:12:55.760 回答
7

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
于 2013-05-15T15:42:28.310 回答