-esHash
を作成しようとしています。Hash
第2レベルのハッシュの値は、デフォルトで0の整数です。私がやろうとしているのは、ハッシュの空のハッシュから始めて、キーが存在しない場合に値を追加するときに、それらのキーを追加する必要があります。デフォルト値で。
単純なHash
整数でこれを試してみると、正常に機能します。
irb(main):003:0> h = Hash.new(0)
=> {}
irb(main):004:0> h[1] += 1
=> 1
irb(main):005:0> p h
{1=>1}
=> nil
irb(main):006:0> h.keys.size
=> 1
irb(main):007:0>
h
現在、1つのキーと1の値があります。完璧です。
しかし、私のハッシュの値がハッシュである場合、それは機能していないようです:
irb(main):007:0> h = Hash.new(Hash.new(0))
=> {}
irb(main):008:0> h[1][1] += 1
=> 1
irb(main):009:0> p h
{}
=> nil
irb(main):010:0> h.keys.size
=> 0
irb(main):011:0>
何か間違ったことをしているのですか、それともハッシュのデフォルト値をに設定できませんHash.new(0)
か?
編集:
以下の回答に基づいて、私は自分が間違っていることを理解することができました。実際、私は自分の考えがどこに間違っているのかを理解することができました。簡単に言うと、呼び出すコードのブロックを指定しない限り、呼び出しをh[1][1]
ネストしません。式の値は期待どおりですが、最も内側のハッシュのみが正しく初期化されていました。Hash.new
Hash.new
h[1][1] += 1
1
上記の例では2次元ハッシュを使用していますが、実際の問題では3次元ハッシュを使用しているため、これを投稿します。
syms[level][exchange][symbol] = count
この解決策は、この問題を抱えている他の人に役立つ可能性があるため、これを私が望むように機能させるコードを次に示します。
irb(main):024:0> syms = Hash.new{|h1,k1| h1[k1] = Hash.new{|h2,k2| h2[k2] = Hash.new(0)}}
=> {}
irb(main):026:0> syms["level1"]["NYSE"]["IBM"] += 1
=> 1
irb(main):027:0> p syms
{"level1"=>{"NYSE"=>{"IBM"=>1}}}
=> nil
irb(main):028:0>