我正在尝试创建一个Hash
-es Hash
。第二级散列的值是一个默认为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。完美。
但是当我的哈希值是哈希时,它似乎不起作用:
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>