使用空数组初始化Ruby哈希作为默认值

时间:2018-11-20 00:20:56

标签: ruby

当我使用默认值(如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

请注意h1 #=> {:foo=>1}h1[:foo] #=> 1的情况。那就是我所期待的。

除非我使用空数组的默认值,否则会发生这种情况:

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"]

请注意h2 #=> {}h2[:foo] #=> ["cats"]的情况。我不知道为什么会这样。

  • 这是怎么回事?
  • 为什么h2看起来像一个空散列,但是仍然具有键:foo的值?

如果我使用一些块,则会发生预期的行为:

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"]的情况。那就是我所期待的。

1 个答案:

答案 0 :(得分:0)

answerHash.new中。简而言之:

  

如果指定了obj(在您的情况下为[]),则此单个对象将用于所有默认值。如果指定了块,则将使用哈希对象和键调用该块,并应返回默认值。如果需要,将值存储在哈希中是块的责任。

使用块初始化以设置非零默认值。