当我用默认值(如0(初始化Ruby哈希并在哈希中创建一个新条目并递增时,它的行为如预期:
irb(main):001:0> h1 = Hash.new(0)
=> {}
irb(main):002:0> h1[:foo] += 1
=> 1
irb(main):003:0> h1
=> {:foo=>1}
irb(main):004:0> h1[:foo]
=> 1
注意CCD_ 1和CCD_。这正是我所期望看到的。
除非我使用空数组的默认值,否则会发生以下情况:
irb(main):005:0> h2 = Hash.new([])
=> {}
irb(main):006:0> h2[:foo] << "cats"
=> ["cats"]
irb(main):007:0> h2
=> {}
irb(main):008:0> h2[:foo]
=> ["cats"]
注意CCD_ 3和CCD_。我不知道为什么会发生这种事。
- 这里发生了什么
- 为什么h2看起来像一个空散列,但仍然有一个密钥为
:foo
的值
如果我使用一些a块,那么预期的行为就会发生:
irb(main):001:0> h3 = Hash.new {|hash, key| hash[key] = [] }
=> {}
irb(main):002:0> h3[:foo] << "cats"
=> ["cats"]
irb(main):003:0> h3
=> {:foo=>["cats"]}
irb(main):004:0> h3[:foo]
=> ["cats"]
请注意h2 #=> {:foo=>["cats"]}
和h3[:foo] #=> ["cats"]
。这正是我所期望看到的。
答案在Hash.new
中。简而言之:
如果指定了obj(在您的情况下为
[]
(,则此单个对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键进行调用,并且应该返回默认值。如果需要,块负责将值存储在哈希中。
使用块初始化以设置非零默认值。