Ruby Hash方法的区别:[] VS:挖

时间:2017-05-25 11:45:15

标签: ruby

我使用Ruby 2.3,它有哈希dig的方法。所以,在v2.3之前如果我有深度嵌套的大哈希,我应该使用很多方法[]。实施例

hashy = { a: { b: { c: { d: 1 }}}}
d_val = hashy[:a][:b][:c][:d] # => 1

在这种情况下,每个方法的调用都会分配新的内存位置,因为它与

相同
a_val = hashy[:a] # => { b: { c: { d: 1 }}}
b_val = a_val[:b] # => { c: { d: 1 }}
c_val = b_val[:c] # => { d: 1 }
d_val = c_val[:d] # => 1

但是来自Ruby 2.3的dig呢。

hashy.dig(:a, :b, :c, :d) # => 1

该方法已在C上编写。所以也许它以另一种方式运行,而不分配额外的(不必要的)内存?

哪种方法更适合使用?

1 个答案:

答案 0 :(得分:2)

 d_val = hashy[:a][:b][:c][:d]
     

在这种情况下,每个方法的调用都会分配新的内存位置

假。你看过方法的实现了吗?那里没有分配。

在该方法中,创建一个新的引用,它指向内存中的现有哈希对象。哈希对象本身没有被复制,因此没有"分配"。

  

[]dig之间的区别是什么?

主要区别在于dig对链中间的nils更加宽容。分配方面,它们似乎是相似的(从代码判断)。