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

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) || ""

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...