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

以空数组作为默认值初始化Ruby哈希,ruby,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的方式。

当我使用默认值(如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#=>{:foo=>[“cats”]}
h3[:foo]#=>[“cats”]
。这就是我希望看到的。

散列中。新的
。简言之:

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

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

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