Ruby 哈希中默认值为数组,使用变量作为 key,出现查找不到的情况

chen248283935 · 2013年08月28日 · 最后由 y29508968 回复于 2013年09月02日 · 2994 次阅读
hash = Hash.new([])
key = "test"

hash[key].push( 1,22,3,4,5)
print hash[key].to_s +  "\n"
print "------------------------------\n"
print hash

结果 [1, 22, 3, 4, 5]


{}

为什么单纯的查看 hash 中没有这个值,要指定 hash[key] 才能看到结果?

默认值在第一次访问不存在的时候才插入

没插入,hash 取不到值时才会返回默认值的

1.9.3p429 :001 > a = Hash.new([])
 => {}
1.9.3p429 :002 > a['asd'].push(1,2)
 => [1, 2]
1.9.3p429 :003 > a
 => {}
1.9.3p429 :006 > a['123']
 => [1, 2]

要插入的话在要在 new 后面加上 block http://ruby-doc.org/core-1.9.3/Hash.html#method-c-new

hash[key].push( 1,22,3,4,5)

你这一行只是往 hash 的默认值里 push 了 5 个值,并没有对 hash 进行 set key,所以现在 hash 的默认值为 [1, 22, 3, 4, 5],对 hash 进行任意取值都会得到 [1, 22, 3, 4, 5],比如:

puts hash[999] # => [1, 22, 3, 4, 5]

你必须进行 hash[key] = value 才会将该 key set 到该 hash 中。 如果你想访问 hash 的 key,但是 key 不存在时,就对该 key 进行赋值,你应该用这种形式:

hash = Hash.new { |h, k| h[k] = [] }

#3 楼 @lifuzho thanks,我现在理解如下,对 hash 进行 set 操作之后,才能对 hash 的这个 key 进行相应的操作,否则我修改的永远是 hash 的默认值

学习了,以前没用过默认值

需要 登录 后方可回复, 如果你还没有账号请 注册新账号