修改默认哈希值

Dra*_*gon 8 ruby hash invisible

Ruby允许您为哈希定义默认值:

h=Hash.new(['alright'])
h['meh'] # => ["alright"]
Run Code Online (Sandbox Code Playgroud)

显示散列时会显示值的赋值,但修改后的默认值不会.在哪里'bad'

h['good']=['fine','dandy']
h['bad'].push('unhappy')
h # => {"good"=>["fine", "dandy"]}
Run Code Online (Sandbox Code Playgroud)

'bad' 如果我们明确要求出现.

h['bad'] # => ["alright", "unhappy"]
Run Code Online (Sandbox Code Playgroud)

为什么在显示哈希时不会显示修改后的默认值?

mu *_*ort 11

哈希的默认值不会像您期望的那样工作.当你说h[k],这个过程是这样的:

  1. 如果我们有一个k键,则返回其值.
  2. 如果我们有Hash的默认值,则返回该默认值.
  3. 如果我们有一个用于提供默认值的块,请执行该块并返回其返回值.

注意,(2)和(3)没有任何关于插入kHash的内容.默认值基本上变为h[k]:

h.has_key?(k) ? h[k] : the_default_value
Run Code Online (Sandbox Code Playgroud)

因此,只需访问一个不存在的密钥并获取默认值就不会将缺少的密钥添加到哈希中.

此外,任何形式:

Hash.new([ ... ])
# or
Hash.new({ ... })
Run Code Online (Sandbox Code Playgroud)

几乎总是一个错误,因为你将为所有默认值共享完全相同的默认数组或哈希值.例如,如果您这样做:

h = Hash.new(['a'])
h[:k].push('b')
Run Code Online (Sandbox Code Playgroud)

然后h[:i],h[:j]...将全部返回['a', 'b'],这很少是你想要的.

我想你正在寻找默认值块形式:

h = Hash.new { |h, k| h[k] = [ 'alright' ] }
Run Code Online (Sandbox Code Playgroud)

这将做两件事:

  1. 访问不存在的密钥会将该密钥添加到Hash中,并且它将提供的Array作为其值.
  2. 所有默认值都是不同的对象,因此更改其中一个不会改变其余对象.