我使用 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 上。所以也许它以另一种方式运行,而不分配额外的(不必要的(内存?
哪种方法更适合使用?
d_val = hashy[:a][:b][:c][:d]
在这种情况下,每个方法的调用都会分配新的内存位置
假。你看过该方法的实现吗?那里没有分配。
在该方法中,将创建一个新的引用,该引用指向内存中的现有哈希对象。哈希对象本身不会被复制,因此没有"分配"。
[]
和dig
有什么区别?
主要区别在于dig
对链条中间的nils更宽容。在分配方面,它们似乎是相似的(从代码来看(。