1

次のキーを使用して2次元ハッシュを保存しようとしています。

  • ディメンション1=数値ですが、連続していません
  • ディメンション2=文字列(:idおよび:valueとして)

この問題は、要素が初期化されていない場合に発生します。

memory = Hash.new(Hash.new(""))
memory[0][:value] = "station1"
memory[1][:value] # => "station1"

にアクセスするmemory[1][:value]と、の値を取得しますmemory[0][:value]。これはどのように可能ですか?私は空の文字列を取得しますが。

4

2 に答える 2

3

何が起こるかを次に示します。最初の行で、空の文字列のデフォルト値を持つHas​​hオブジェクトのデフォルト値で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

したがって、基本的には、外部ハッシュの存在しないキーにアクセスして内部ハッシュを変更します。これにより、内部ハッシュへの参照が返されます。

于 2013-01-04T14:45:03.703 に答える
1

キーごとに新しいハッシュオブジェクトを作成する必要があります。この例では、すべてのキーが同じハッシュオブジェクトを共有しています。

memory = Hash.new{|h, k| h[k] = Hash.new("")}
memory[1][:value] # => ""
memory[1][:value] = "a"
memory[1][:value] # => "a"
memory[2][:value] # => ""
于 2013-01-04T14:44:45.693 に答える