我有以下代码:
$ze = Hash.new( Hash.new(2) )
$ze['test'] = {0=> 'a', 1=>'b', 3 => 'c'}
$ze[5][0] = 'one'
$ze[5][1] = "two"
puts $ze
puts $ze[5]
这是输出:
{"test"=>{0=>"a", 1=>"b", 3=>"c"}}
{0=>"one", 1=>"two"}
为什么不输出:
{"test"=>{0=>"a", 1=>"b", 3=>"c"}, 5=>{0=>"one", 1=>"two"}}
{0=>"one", 1=>"two"}
?
最佳答案
使用$ze[5][0] = xxx
,您首先要调用[]
的getter $ze
,然后调用[]=
的二传手$ze[5]
。参见Hash's API。
如果$ze
不包含 key ,它将返回您使用Hash.new(2)
初始化的默认值。
$ze[5][0] = 'one'
# in detail
$ze[5] # this key does not exist,
# this will then return you default hash.
default_hash[0] = 'one'
$ze[5][1] = 'two'
# the same here
default_hash[1] = 'two'
您没有向
$ze
添加任何内容,而是向其默认哈希添加了键/值对。这就是为什么您也可以这样做。您将得到与
$ze[5]
相同的结果。puts $ze[:do_not_exist]
# => {0=>"one", 1=>"two"}