数组 – 如何在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) || "" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |