2017-05-25 10 views
1

私はRuby 2.3を使用しており、Hash のメソッドを持っています。したがって、v2.3より前に深いネスティングで大きなハッシュがあれば、多くのメソッドを使用する必要があります[]。この場合の例Ruby Hashメソッドの相違点:[] 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] 

、各メソッドの呼び出しは、新しいメモリ場所

はFalseを割り当てます。あなたはメソッドの実装を見ましたか?そこに割り当てはありません。

この方法では、新しい参照が作成されます。これはメモリ内の既存のハッシュオブジェクトを指します。ハッシュオブジェクト自体はコピーされないので、「割り当て」もありません。

[]との違いは何ですか?

主な相違点は、がチェーンの真ん中にあるnilsをはるかに許していることです。配分に応じて、それらは(コードから判断すると)類似しているように見えます。

+0

しかし、それは方法のチェーンにすぎません。 –

+0

@OlegSobchuk:だから?メモリはコピーされません。同じオブジェクトへの新しい参照が作成されます。 –

+0

はい、しかし、各メソッドよりメソッドの呼び出しチェーンが新しいメモリを割り当てる場合 –