Ruby Hash.new怪异

cha*_*log 2 ruby hashmap

可能重复:
使用Hash.new([])时出现奇怪的ruby行为

这很简单,因为我迷失了语言.

为什么会这样:

1.9.3-p194 :001 > h = Hash.new([])
 => {} 
1.9.3-p194 :002 > h[:key1] << "Ruby"
 => ["Ruby"] 
1.9.3-p194 :003 > h
 => {} 
1.9.3-p194 :004 > h.keys
 => [] 
1.9.3-p194 :005 > h[:key1]
 => ["Ruby"] 
Run Code Online (Sandbox Code Playgroud)

mkz*_*mkz 8

当您创建这样的哈希时:

h = Hash.new([])       
Run Code Online (Sandbox Code Playgroud)

这意味着,每当使用尚未定义的密钥访问哈希时,它将返回:

[]
Run Code Online (Sandbox Code Playgroud)

现在你做的时候:

h[:key1] << "Ruby"
Run Code Online (Sandbox Code Playgroud)

h[:key1]已经返回[],"Ruby"被推送,导致["Ruby"]输出,因为这是返回的最后一个对象.当使用未定义的键访问'h'时,它也被设置为返回的默认值.因此,当你这样做时:

h[:key1] or h[:key2] or h[:whatever]
Run Code Online (Sandbox Code Playgroud)

你会得到

"Ruby"
Run Code Online (Sandbox Code Playgroud)

作为输出.希望这可以帮助.