gpt4 book ai didi

arrays - 如何使用 Ruby 2.3 中引入的 Array#dig 和 Hash#dig?

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:20 24 4
gpt4 key购买 nike

Ruby 2.3 在ArrayHash 上引入了一种新方法,称为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, 0) # => 1

我没有使用三层嵌套平面数组。什么是这将如何有用的现实示例?

更新

事实证明,这些方法解决了最常见的 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

最佳答案

在我们的例子中,NoMethodError由于 nil 引用是迄今为止我们在生产环境中看到的最常见的错误。

新的 Hash#dig 允许您在访问嵌套元素时省略 nil 检查。由于散列最适用于数据结构未知或易变的情况,因此获得官方支持非常有意义。

让我们举个例子。以下内容:

user.dig(:user, :address, :street1)

等同于:

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

user[:user]user[:user][:address]nil 的情况下,这将导致运行时错误。

相反,它等同于以下内容,这是当前的成语:

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

请注意,将在别处创建的符号列表传递到 Hash#dig 中是多么简单,而从这样的列表中重新创建后一个构造并不是很简单。 Hash#dig 允许您轻松地进行动态访问,而不必担心 nil 引用。

显然 Hash#dig 也短了很多。


需要注意的重要一点是,如果任何键结果是,Hash#dig 本身返回 nil,这可能导致同一类错误一步,所以提供一个合理的默认值是个好主意。 (这种提供始终响应预期方法的对象的方式称为 Null Object Pattern。)

同样,在您的示例中,空字符串或类似“N/A”的内容,具体取决于什么有意义:

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

关于arrays - 如何使用 Ruby 2.3 中引入的 Array#dig 和 Hash#dig?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39612885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com