来自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功能非常丰富,可以处理许多情况,具体取决于它的使用方式.出于这个原因,我倾向于使用#[]访问密钥.

*正如马克·安德烈·拉福琼(Marc AndréLafortune)所说,使用#[]访问密钥时,如果存在,将调用#default_proc,否则返回#default,默认为nil.更多信息请参见the doc entry for ::new.

Ruby相关问答推荐

如何查询哪些RuboCop规则适用于文件?

Ruby - 将两个哈希与一些相似的键合并

Ruby:拆分,然后删除前导/尾随空格?

如何在 Ruby 的 RestClient gem 中设置超时?

在 Go (golang) 中编写一个 Ruby 扩展

从href html标签中提取带有Ruby中nokogiri的链接(URL)?

根据另一个数组的元素对数组进行排序

如何判断我是从 JRuby 还是 Ruby 运行?

`require': no such file to load in ruby

如何通过拆分字符的最后一次出现将字符串拆分为仅两部分?

从 Ruby 中的 URL 获取文件名的好方法是什么?

如何让 Ruby 1.9 成为 Ubuntu 上的默认 Ruby?

Xcode - 配置:错误:在 $PATH 中找不到可接受的 C 编译器

判断整数是否在范围内

为什么在 ruby​​ 中动态创建大量符号不是一个好主意(对于 2.2 之前的版本)?

类变量上的 attr_accessor

让 sidekiq 立即执行作业(job)

在 Ruby 中解析制表符分隔文件的最佳方法是什么?

查找与给定条件匹配的元素的索引

判断文件名是文件夹还是文件