Ruby Hash of Arrays输出{}

jx1*_*345 4 ruby

如果我执行以下操作:

h = Hash.new(Array.new)
h['a'].push('apple')

puts h['a']
puts h 
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

apple
{}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么把h输出不输出:

{"a"=>["apple"]}
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢...

Aru*_*hit 13

读这个

new(obj)→new_hash

如果obj指定,则此单个对象将用于所有默认值.

Hash.new(Array.new)- 通过这一行,您创建了一个默认数组对象.每当您想要访问哈希中不存在的密钥时,将返回该密钥.

h['a'].push('apple')- 通过这一行,您实际上将值添加/推送到该默认数组对象,但不向哈希添加任何键.h['a']正在返回你定义的数组Array.new,就是你正在调用的Array#push那个,就是all.这h['a']就是给你那个默认数组的当前内容.puts hofcourse会给你{},因为你没有将键添加'a'到哈希.

看到同样的行动:

h = Hash.new(Array.new)
h.default # => []
h['a'].push('apple')
h.default # => ["apple"]
Run Code Online (Sandbox Code Playgroud)

现在再看一下代码:

#adding a key
h['a'] = 'Bob'
h['a'] # => "Bob"
h # => {"a"=>"Bob"}
#again default vaule as you are trying to aceess a non-exist key
h['b'] # => ["apple"]
Run Code Online (Sandbox Code Playgroud)

值得一读 Hash#[]

元素引用 - 检索与键对象对应的值对象.如果未找到,则返回默认值(Hash::new有关详细信息,请参阅).