2012-09-26 71 views
-2
a = ["Bob Green", "Don Brown", "Rich Freedom"] 

a_hash = {"key_name" =>{"name" => "a_name", "a_thing" => 0}} 

keys = a_hash.keys 

for i in 0..a.length 
    aCOG = a[i] 
    aCOGkey = a[i].to_s.downcase.delete(' ') 

    keys[i] = aCOGkey 
    a_hash[keys[i]]["name"] = aCOG #why does this line fail? 
end 
+4

這真的很難確定你在這裏做什麼。嘗試解釋什麼是故意,失敗,錯誤信息等。另請參閱[常見問題]。 –

回答

0

寫一個新的鍵值對哈希內的哈希能像這樣工作:

outer_hash['inner_hash_key']['new_key_in_inner_hash'] = 'String I want to add'. 
2

讓我們來看看:

keys[0] == aCOGkey == a[0] == "bobgreen" 

貌似是線路出現故障時,因爲沒有鑰匙「bobgreen 「在a_hash

+0

雖然會創建一個新條目,不是嗎? –

+0

自從我使用Ruby之後已經有一段時間了,我現在無法測試它,但是我很確定在創建'a_hash [keys [i]]'之前嘗試訪問'name'會導致它崩潰。 –

1

嵌套哈希不只是自己創建。換句話說,Ruby並不知道密鑰的值也是一個哈希值。

你可以使用所有方法上面具體分配的散列,或者可以使用

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

這假定在a_hash所有值是散列(嵌套散列)。此方法可以將默認值設置爲散列。您也可以設置h[k] = {name:"",a_thing:0}

所以你只需要做這樣的:

a = ["Bob Green", "Don Brown", "Rich Freedom"]  
a_hash = Hash.new { |h,k| h[k] = {} }  
a.each{|n| a_hash[n.to_s.downcase.delete(' ')]["name"] = n} 

儘量不要在Ruby中使用for。改用枚舉數。 使用符號作爲散列鍵。

+0

「使用散列鍵的符號」,當它有意義時。多用途地嘗試使用符號作爲散列鍵可能令人沮喪,因爲有時候這個鍵太複雜而不能成爲符號。 –

+0

什麼時候有道理?參考:http://stackoverflow.com/questions/8189416/why-use-symbols-as-hash-keys-in-ruby另外,如果你知道你可以用這種方式使用符號,它永遠不會太複雜':「這是一個複雜的符號」' – texasbruce

+0

散列鍵不一定是一個字符串。它可以是任何對象。嘗試將所有可以想象的對象轉換爲符號。他們不適合。所以,雖然使用符號來表示速度和內存是一種很好的做法,但並不總是有利的,並且並不總是會導致最易讀的代碼,即投票能夠承受。 –