2017-05-25 54 views
1

我使用Ruby 2.3,它有Hash 的方法。所以,在v2.3之前如果我有很深的嵌套散列,我应该使用很多方法[]。例如红宝石散列方法区别:[] VS:dig

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的东西。

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

该方法写在C.所以也许它运行在另一种方式,没有分配额外的(不必要的)内存?

哪种方法更适合使用?

+0

JFYI,这两种方法都在C中实现。 –

+0

Ahem ... https://github.com/rubinius/rubinius/blob/master/core/hash.rb#L534-L541 https://github.com/rubinius /rubinius/blob/master/core/hash.rb#L394-L403 –

回答

2
d_val = hashy[:a][:b][:c][:d] 
在这种情况下

,每个方法的调用分配新的内存位置

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

在该方法中,创建了一个新的参考,它指向内存中的现有散列对象。散列对象本身不会被复制,因此没有“分配”。

[]和有什么区别?

主要区别在于更容易在链中间的nils。按照分配方式,它们看起来是相似的(从代码判断)。

+0

但它只是方法链 –

+0

@OlegSobchuk:那么?内存不被复制。只创建对同一对象的新引用。 –

+0

是的,但如果调用链的方法比每个方法分配新的内存 –