-3
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
Sully
  • 14,672
  • 5
  • 54
  • 79
  • 4
    It is really hard to figure what are you trying to do here. Try explaining what was the intent and what failed, error message, etc. Also please see the [FAQ]. – Jakub Hampl Sep 26 '12 at 20:10

3 Answers3

2

Let's see:

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

Looks like that line fails because there's no key "bobgreen" in a_hash.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Jesse Jashinsky
  • 10,313
  • 6
  • 38
  • 63
1

Nested hash does not just create on its own. In another word, Ruby does not know the value to the key is a hash too.

You may use all methods above to specifically assign a hash, or you can use

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

This assumes all values in a_hash is a hash (nested hash). This method can set default value to a hash. You can also set h[k] = {name:"",a_thing:0} in your case.

So you only need to do like:

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}

Try not to use for in Ruby. Use enumerators instead. Use symbols for hash keys.

SwiftMango
  • 15,092
  • 13
  • 71
  • 136
  • "Use symbols for hash keys", when it makes sense. Dogmatically trying to use symbols for hash keys can be frustrating because sometimes the key is too complex to be a symbol. – the Tin Man Sep 26 '12 at 23:07
  • When it makes sense? Ref: http://stackoverflow.com/questions/8189416/why-use-symbols-as-hash-keys-in-ruby Also, it's never too complex to be a symbol if you know you can use a symbol in this way `:"this is a complex symbol"` – SwiftMango Sep 27 '12 at 13:45
  • A hash key isn't necessarily a string. It can be any object. Try converting all the objects you can imagine into a symbol. They don't fit. So, while it's a good practice to use symbols for speed and memory, it's not always expedient and doesn't always lead to the most readable code, votes withstanding. – the Tin Man Sep 27 '12 at 15:37
  • Thanks for the lesson. I think everyone knows that. That post explains really well of my point. EOC. – SwiftMango Sep 27 '12 at 16:14
0

Writing a new key value pair to a hash inside a hash can work like this:

outer_hash['inner_hash_key']['new_key_in_inner_hash'] = 'String I want to add'.
Thomas Klemm
  • 10,678
  • 1
  • 51
  • 54