2012-12-25 86 views
5

我有這樣的代碼:爲什麼不是這個Ruby哈希我認爲它會是什麼?

$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"} 

+7

不要使用全局變量,它們是醜陋! – Hauleth

回答

5

隨着$ze[5][0] = xxx你第一次調用吸氣劑$ze[],然後調用二傳手$ze[5][]=。請參閱Hash's API

如果$ze不包含密鑰,它將返回您使用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"} 
+0

哦!我沒有意識到你甚至可以修改默認的散列。謝謝。 – Turnsole

1
h = Hash.new(2) 
print "h['a'] : "; p h['a'] 

$ze = Hash.new(Hash.new(2)) 
print '$ze[:do_not_exist] : '; p $ze[:do_not_exist] 
print '$ze[:do_not_exist][5] : '; p $ze[:do_not_exist][5] 

$ze = Hash.new{|hash, key| hash[key] = {}} 
$ze['test'] = {0=> 'a', 1=>'b', 3 => 'c'} 
$ze[5][0] = 'one' 
$ze[5][1] = "two" 
print '$ze : '; p $ze 

執行:

$ ruby -w t.rb 
h['a'] : 2 
$ze[:do_not_exist] : {} 
$ze[:do_not_exist][5] : 2 
$ze : {"test"=>{0=>"a", 1=>"b", 3=>"c"}, 5=>{0=>"one", 1=>"two"}} 
相關問題