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

This is one level deep defaults to a fresh new hash.

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

This is two levels deep initialization to a fresh new hash.

How do I this for arbitrarily deep hashes?

h[“a”][“b”][“c”] = 3 #=> {“c”=>3}

I’m using this to build very clean implementations of state machine

building algorithms.

Your help is very much appreciated.

-Ray

Ray Pereda wrote:

How do I this for arbitrarily deep hashes?

Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}

HTH,

Sebastian

Sebastian H. wrote:

Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}

Thanks for the attempt. Seems on the right track but not quite.

h = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}

=> {}

h[“a”][“b”][“c”]

=> {}

h

=> {“c”=>{}}

After h[“a”][“b”][“c”]

what needs to happen is h is equal to

{“a”=>{“b”=>{“c”=>{}}}}

Appreciating the Ruby Community’s Help,

Ray

On Aug 15, 2008, at 1:32, Ray Pereda wrote:

h = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}

Don’t do that. The h inside the block is conflicting with the h

outside. Make sure the variables don’t collide, and it works:

the_hash = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}

=> {}

the_hash[:a][:b][:c]

=> {}

the_hash

=> {:a=>{:b=>{:c=>{}}}}

I should add: the same-variable-name version works in Ruby 1.9.

David

Hi –

On Fri, 15 Aug 2008, Ray Pereda wrote:

=> {“c”=>{}}

After h[“a”][“b”][“c”]

what needs to happen is h is equal to

{“a”=>{“b”=>{“c”=>{}}}}

I think it’s a variable clobbering issue. Try this:

hash = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc) }

David