<分区>
我正在尝试创建 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
一个 block 要调用的代码。表达式 h[1][1] += 1
的值如预期的那样是 1
,但只有最里面的哈希被正确初始化。
我发布这个是因为虽然我上面的例子使用了二维散列,但我的实际问题使用了 3 维散列:
syms[级别][交换][符号] = 计数
该解决方案可能对遇到此问题的其他人有所帮助,所以这里是使它按照我想要的方式工作的代码:
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>