# Hash two dimensions

**URL:** <https://www.ruby-forum.com/t/hash-two-dimensions/126807>\
**Category:** Ruby\
**Created:** [January 22, 2008, 1:42pm UTC](https://www.ruby-forum.com/t/hash-two-dimensions/126807 "2008-01-22T13:42:23Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![tcblues](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/db5fbb/32.png) [@tcblues](https://www.ruby-forum.com/u/tcblues)\
**Post date:** [January 22, 2008, 1:42pm UTC](https://www.ruby-forum.com/t/hash-two-dimensions/126807/1 "2008-01-22T13:42:23Z")

</div>

Hi Everybody!  
I’m doing this:  
$Config=Hash.new(Hash.new())  
$Config[“UNO”][“urlX”]=“beep/UNO/playdoit.do”  
$Config[“UNO”][“urlY”]=“beep/UNO/dontplayPP.do”  
$Config[“UNO”][“urlZ”]=“beep/UNO/dontplay34jo.do”  
$Config[“DOS”][“urlX”]=“beep/DOS/playad.do”  
$Config[“DOS”][“urlY”]=“beep/DOS/dontplayf.do”  
$Config[“DOS”][“urlZ”]=“beep/DOS/dontplay34aa.do”  
$Config[“TRES”][“urlX”]=“beep/TRES/playcs.do”  
$Config[“TRES”][“urlY”]=“beep/TRES/dontplayff.do”  
$Config[“TRES”][“urlZ”]=“beep/TRES/dontplay34s.do”

when I try to access to the value in $Config[“UNO”][“urlY”] the result  
is the value in $Config[TRES"][“urlY”]

Why??

Thanks a lot.

---

<div class="post-metadata">

**Author:** ![tcblues](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/db5fbb/32.png) [@tcblues](https://www.ruby-forum.com/u/tcblues)\
**Post date:** [January 22, 2008, 1:51pm UTC](https://www.ruby-forum.com/t/hash-two-dimensions/126807/2 "2008-01-22T13:51:43Z")

</div>

On Jan 22, 2008 7:42 AM, Mario R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> $Config["TRES"]["urlY"]="beep/TRES/dontplayff.do"
> $Config["TRES"]["urlZ"]="beep/TRES/dontplay34s.do"
> 
> ```
> 
> when I try to access to the value in $Config[“UNO”][“urlY”] the result  
> is the value in $Config[TRES"][“urlY”]
> 
> Why??

Because it’s always the same hash. What you _want_ is:

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

-austin

---

<div class="post-metadata">

**Author:** ![tcblues](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/db5fbb/32.png) [@tcblues](https://www.ruby-forum.com/u/tcblues)\
**Post date:** [January 22, 2008, 1:53pm UTC](https://www.ruby-forum.com/t/hash-two-dimensions/126807/3 "2008-01-22T13:53:19Z")

</div>

Yeah it’s working.

Thank you very much.

---

<div class="post-metadata">

**Author:** ![tcblues](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/db5fbb/32.png) [@tcblues](https://www.ruby-forum.com/u/tcblues)\
**Post date:** [January 22, 2008, 2:40pm UTC](https://www.ruby-forum.com/t/hash-two-dimensions/126807/4 "2008-01-22T14:40:32Z")

</div>

I had this problem a lot when I started to use ruby, especially coming  
from perl with its hashes of arrays of arrays of hashes.

After a while I realized that these nested structures basically  
pointed out that I should create a class to contain this type of data.  
And just put those objects in an array. So for your example:

class Setting  
def initialize(platform, setting, value)  
@platform, @setting, @value = platform, setting, value  
end  
attr\_accessor :platform, :setting, :value  
end

configuration = Array.new  
configuration.push(Setting.new(“UNO”, “urlX”, “beep/UNO/playdoit.do”))  
configuration.push(Setting.new(“UNO”, “urlY”, “beep/UNO/  
dontplayPP.do”))  
…

---

<div class="post-metadata">

**Author:** ![tcblues](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/db5fbb/32.png) [@tcblues](https://www.ruby-forum.com/u/tcblues)\
**Post date:** [January 22, 2008, 3:28pm UTC](https://www.ruby-forum.com/t/hash-two-dimensions/126807/5 "2008-01-22T15:28:54Z")

</div>

On Jan 22, 2008 2:39 PM, jandot [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> configuration.push(Setting.new(“UNO”, “urlY”, “beep/UNO/  
> dontplayPP.do”))

You can do the same with Ruby’s built-in Structs with less code:

Setting = Struct.new(:platform, :setting, :value)  
configuration = Array.new  
configuration.push(Setting.new(“UNO”, “urlX”, “beep/UNO/playdoit.do”))  
configuration.push(Setting.new(“UNO”, “urlY”, “beep/UNO/dontplayPP.do”))  
last = configuration.pop  
puts last.platform

I also like that one  
[http://groups.google.de/group/comp.lang.ruby/msg/d11d68c9d3889cc5](http://groups.google.de/group/comp.lang.ruby/msg/d11d68c9d3889cc5)
