2012-09-26 65 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

散列键不一定是一个字符串。它可以是任何对象。尝试将所有可以想象的对象转换为符号。他们不适合。所以,虽然使用符号来表示速度和内存是一种很好的做法,但并不总是有利的,并且并不总是会导致最易读的代码,即投票能够承受。 –