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

all*_*rry 67 ruby

来自Ruby Koans about_hashes.rb:

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

Jon*_*rns 138

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

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

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

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

*正如Marc-AndréLafortune所说,访问一个密钥#[]会调用#default_proc它是否存在,否则返回#default,默认为nil.有关 更多信息,请参阅doc条目::new.

  • 很好的答案,除了技术上不正确.`#[]`当键不存在时会调用`#default_proc`如果有的话或者返回`#default`.默认情况下,`#default`返回`nil`. (11认同)

Jör*_*tag 24

有了[],哈希的创建者控制当一个键不存在时会发生什么,就像fetch你一样.


Ser*_*sev 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
Run Code Online (Sandbox Code Playgroud)

  • @LBg:不,不是.它与`begin h.fetch(:foo)相同; rescue KeyError; 如果h.default_proc则h.default_proc.()否则h.default结束`. (9认同)
  • h [:foo]与h.fetch(:foo,nil)相同。 (2认同)