ruby - 哈希方法获取红宝石
问题描述
我需要获取一些哈希值,但是,我不知道该怎么做!我的数据:
data = {
name: "Pedro Álvares",
age: 35,
sensitive_data: {
cpf_cnpj=>27046645678,
fantasy_name: "I have the power"
}
}
我搜索 ruby 方法并找到方法values_at,但此方法仅获取 first_data ,例如name、age。如果我使用:
name = data.values_at(:name)
返回的字段是Pedro Álvares 但如果我尝试使用:
fantasy_name = data.values_at(:fantasy_name)
返回的数据为nil。
如何在不使用data[:sensitive_data][:fantasy_name]的情况下获取该字段?
解决方案
因为您知道哈希的正确结构,所以您应该编写:
data[:sensitive_data][:fantasy_name]
#=> "I have the power"
你不应该dig
在这里使用。为什么?假设你不小心写了
data.dig(:sesnitive_data, :fantasy_name)
将返回nil
(因为data
没有 key :sesnitive
)。根据上下文,错误可能要到稍后才会出现,从而使调试变得比必要的更加困难。
相比之下,如果你写
data[:sesnitive_data][:fantasy_name]
data[:sesnitive_data]
会返回nil
(因为data
没有 key :sesnitive_data
)然后nil[:sesnitive_data]
会引发异常,通知你nil
没有方法[]
。这正是您希望发生的事情:您希望立即收到错误通知,并查明错误原因,以便您可以轻松更正代码。
Hash#dig、Array#dig和Struct#dig(它们相互调用)有它们的用途(当您事先不知道对象的结构时——例如,哈希的键),但在以下情况下不应该使用这些方法对象的结构是已知的。
推荐阅读
- javascript - Jest 不会模拟(设置间谍)所需的功能
- php - PHP 文件未执行所有 3 个查询
- mysql - MYSQL:为给定过滤器选择一行和键的最大值
- javascript - 用逗号分割逗号分隔的字符串
- java - JAVA - HTTP 请求 - 得到错误的响应
- python-3.x - 双循环
- fonts - 无法在高级 pdf 模板中使用 Calibri 字体
- java - 使用正则表达式在 UNSPSC 中获取商品级别
- google-cloud-platform - 如果您已经注册了 Google Cloud Platform,如何注册 Cloud Identity for Google Cloud Platform?
- java - Http控制器参数对象定义为DTO还是其他?