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