Ruby哈希方法的区别:[]与:dig

Ruby哈希方法的区别:[]与:dig,ruby,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

我使用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上写的,所以它可能以另一种方式运行,而不分配额外的(不必要的)内存

哪种方法更适合使用

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

错。你看过这个方法的实现吗?那里没有分配

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

[]
dig
之间有什么区别


<> P>主要区别在于:代码>挖掘\代码>对链中的NILS更为宽容。就分配而言,它们看起来很相似(从代码判断)。

但这只是一条链methods@OlegSobchuk:那么?内存没有被复制。只创建对相同对象的新引用。是的,但如果调用方法链,则每个方法都会分配新的引用memory@OlegSobchuk:啊,那一堆呢?我不会担心这些分配。是的,但也许
dig
方法解决了这个问题。或者它以相同的方式运行?JFYI,这两种方法都在C中实现…
 d_val = hashy[:a][:b][:c][:d]