加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组 – 如何在Ruby 2.3中引入“Array#dig”和“Hash#dig”?

发布时间:2020-12-16 19:48:14 所属栏目:百科 来源:网络整理
导读:Ruby 2.3引入了一个新的方法,Array和Hash称为dig.我在博客文章中看到的关于新版本的例子是有创意和复杂的: # Hash#diguser = { user: { address: { street1: '123 Main street' } }}user.dig(:user,:address,:street1) # = '123 Main street'# Array#digres
Ruby 2.3引入了一个新的方法,Array和Hash称为dig.我在博客文章中看到的关于新版本的例子是有创意和复杂的:
# Hash#dig
user = {
  user: {
    address: {
      street1: '123 Main street'
    }
  }
}

user.dig(:user,:address,:street1) # => '123 Main street'

# Array#dig
results = [[[1,2,3]]]
results.dig(0,0) # => 1

我没有使用三嵌套平面数组.什么是如何有用的现实的例子?

UPDATE

事实证明,这些方法解决了最常见的Ruby问题之一.下面的问题有20个重复的东西,所有这些都是通过使用dig来解决的:

How to avoid NoMethodError for missing elements in nested hashes,without repeated nil checks?

Ruby Style: How to check whether a nested hash element exists

解决方法

在我们的例子中,由于零引用的NoMethodErrors是我们在生产环境中看到的最常见的错误.

新的Hash#dig允许您在访问嵌套元素时省略零检查.由于哈希算法最适合用于数据结构未知或不稳定的情况,因此对此的正式支持有很大的意义.

让我们举个例子.下列:

user.dig(:user,:street1)

不等同于:

user[:user][:address][:street1]

在用户[:user]或用户[:user] [:address]为零的情况下,会导致运行时错误.

相反,它相当于以下,这是现在的成语:

user[:user] && user[:user][:address] && user[:user][:address][:street1]

请注意,将其他地方创建的符号列表传递到Hash#dig中是很简单的,而从这样的列表中重新创建后一个构造并不是很简单. Hash#dig允许您轻松地进行动态访问,而无需担心零参考.

显然,哈希#挖也比很短.

需要注意的一个重要的一点是,如果有任何一个关键字,Hash#dig本身返回零,这可能会导致同一类错误,一行下来,因此提供一个合理的默认(这种提供一种总是响应预期方法的对象的方式称为Null Object Pattern.)

再次,在你的例子中,一个空字符串或类似“N / A”,取决于什么是有意义的:

user.dig(:user,:street1) || ""

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读