2013-05-15 36 views

回答

110

默认情况下,使用#[]如果存在将获取的散列值,并返回nil,如果它不存在,*。

使用#fetch为您提供了几个选项(参见#fetch的文档):

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

每一个应该使用的情况下需要,但#fetch是非常丰富的功能,可以处理很多情况下,取决于它如何使用。出于这个原因,我倾向于使用#[]来访问密钥。

*由于马克 - 安德烈·Lafortune说,访问键与#[]将调用#default_proc如果它存在,否则返回#default,默认为nil。有关更多信息,请参见the doc entry for ::new

+0

谢谢!简洁明了,除此之外还有一些背景。 – allanberry

+7

好的答案,除了技术上不正确。当密钥不存在时'#[]'会调用'#default_proc',否则返回'#default'。默认情况下,'#default'返回'nil'。 –

+0

@ Marc-AndréLafortune谢谢,我学到了一些新东西!更新了答案。 –

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 
+1

'h [:foo]'与'h.fetch(:foo,nil)'相同。 –

+1

@LBg:它表现相同,是 –

+6

@LBg:不,它不是。它与'begin h.fetch(:foo)相同;救援KeyError;如果h.default_proc然后h.default_proc。()else h.default end end'。 –

19

随着[],哈希的创建者控制了一个密钥不存在时发生的事情,fetch你做。