何が起こるかを次に示します。最初の行で、空の文字列のデフォルト値を持つHashオブジェクトのデフォルト値でHashオブジェクトを作成します。存在しないキーにアクセスすると、オブジェクトが返されます。
irb(main):004:0> memory = Hash.new(Hash.new(""))
=> {}
irb(main):007:0> memory[0].object_id
=> 70350452886020
irb(main):008:0> memory[1].object_id
=> 70350452886020
irb(main):005:0> memory[0][:value]
=> ""
irb(main):006:0> memory[0][:value].object_id
=> 70137307419240
irb(main):007:0> memory[1][:value].object_id
=> 70137307419240
内部ハッシュの存在しない値にアクセスすると、デフォルトのハッシュオブジェクトが返されます。memory[0][:value] = "station1"
したがって、キー0がまだ存在しない状態で定義することにより、キーの値station1
を:value
内部ハッシュに設定します。外側のハッシュに存在しない別のキーにアクセスすると、内側のハッシュが再び返され、キーは:value
すでに次のように設定されてい"station1"
ます。
irb(main):008:0> memory[0][:value] = 'station1'
=> "station1"
irb(main):011:0> memory[0][:value]
=> "station1"
irb(main):012:0> memory[1][:value]
=> "station1"
irb(main):007:0> memory[0].object_id
=> 70350452886020
irb(main):008:0> memory[1].object_id
=> 70350452886020
irb(main):009:0> memory[0][:value].object_id
=> 70137307342120
irb(main):010:0> memory[1][:value].object_id
=> 70137307342120
したがって、基本的には、外部ハッシュの存在しないキーにアクセスして内部ハッシュを変更します。これにより、内部ハッシュへの参照が返されます。