比较来自世界各地的卖家的域名和 IT 服务价格

如何使用 Array#dig 和 Hash#dig, 介绍 Ruby 2.3?

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, 0/ # => 1


我不使用三重嵌套的扁平阵列。 如何有用的实际例子是什么?

UPDATE

事实证明,这些方法解决了最常见的一个 Ruby 问题。 以下的问题有类似的东西 20 复制品,所有这些都解决了
dig

:

https://coderoad.ru/4371716/
https://coderoad.ru/1820451/
hash
已邀请:

诸葛浮云

赞同来自:

在我们的情况下
NoMethodError

s 的 - 为了
nil

今天的链接是我们在生产环境中看到的最常见错误。

新参数
Hash#dig

允许您跳过检查
nil

访问嵌套项目时。 由于在数据结构未知或更改的情况下,Hashi最好使用,因此对此的官方支持有很多意义。

让我们来吧你的榜样。 下列的:


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

, 如果任何键都这样才能使其也可以导致相同类的错误在线下面一步,因此提供合理的默认值可能是一个好主意。 /这种方法提供始终用预期方法响应的对象
https://en.wikipedia.org/wiki/ ... 3Ruby
Null ./

再次,在您的示例中,空字符串或类似的东西 "N/A", 取决于什么是有意义的:


user.dig/:user, :address, :street1/ || ""

董宝中

赞同来自:

其中一种方法 - 与操作员结合使用 splat, 从某些未知文档模型读取数据。


some_json = JSON.parse/ '{"people": {"me": 6, ... } ...}' /
# => "{"people" => {"me" => 6, ... }, ... }
a_bunch_of_args = response.data[:query]
# => ["people", "me"]
some_json.dig/*a_bunch_of_args/
# => 6

喜特乐

赞同来自:

这对于深层嵌入式工作是有用的。 Hashes/Arrays,, 这可能是您从呼叫中回馈的内容 API, 例如。

理论上

这会保存一吨代码,如果存在另一个级别,则会在每个级别检查任何级别,在没有哪些级别的情况下持续错误。

在实践中

你还需要很多这个代码,因为
dig

无论如何会在某些情况下创造错误 /例如,如果链中的某些内容是一个未精炼的对象。/

因此,您的问题实际上非常忠诚。 -
dig

我没有看到我们可以期待的用途。 这在此处评论,例如:
http://anamaria.martinezgomez. ... .html
.

去做
dig

避免这些错误,尝试
https://github.com/Convincible ... _dial
gem, 我写的包裹着
dig

并恢复回归 nil/default, 如果发生任何错误。

要回复问题请先登录注册