使用哈希时获取与[]的对比?

时间:2013-05-15 15:39:18

标签: ruby

来自Ruby Koans about_hashes.rb

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

3 个答案:

答案 0 :(得分:133)

默认情况下,使用#[]将检索哈希值(如果存在),如果哈希值不存在,则返回nil *。

使用#fetch为您提供了一些选项(请参阅#fetch上的文档):

  • fetch(key_name):如果密钥存在,则获取值,如果密钥不存在,则引发KeyError
  • fetch(key_name, default_value):如果密钥存在,则获取值,否则返回default_value
  • fetch(key_name) { |key| "default" }:如果密钥存在,则获取值,否则运行提供的块并返回值。

每个应该根据情况需要使用,但#fetch功能非常丰富,可以处理许多情况,具体取决于它的使用方式。出于这个原因,我倾向于使用#[]来访问密钥。

*正如Marc-AndréLafortune所说,使用#[]访问密钥会调用#default_proc(如果存在),或者返回#default,默认为nil。有关详细信息,请参阅the doc entry for ::new

答案 1 :(得分:22)

使用[]时,哈希的创建者会控制当密钥不存在时会发生什么,而fetch就是这样。

答案 2 :(得分:6)

默认情况下,

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