Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Hash of arrays - whats going on?

Reply
Thread Tools

Hash of arrays - whats going on?

 
 
stephen O'D
Guest
Posts: n/a
 
      07-19-2007
I want a hash, where the values of the keys are arrays, eg

h = Hash.new
h.default = []

h['foo'] << 10
h[foo'] << 20
h['bar'] << 23
h['bar'] << 33

I thought this would give me

{ 'foo' => [20 30],
'bar' => [23, 33] }

but it doesn't - it seems to put the same array in the value of each
key. Some googling revealed I need to create my hash like:

h = Hash.new { |hash, key| hash[key] = [] }

So my problem is solved, but why do you have to do it like this? At
the risk of answering my own question, is it because the block is re-
executed everytime you access a non existent key, creating a brand new
array object, while the first way, it just initialises the value to
the same array each time?

Thanks,

Stephen.

 
Reply With Quote
 
 
 
 
Kyle Schmitt
Guest
Posts: n/a
 
      07-19-2007
default just lets you return a default value if the request key
doesn't exist, it's not _supposed_ to change the state of the hash.

What was happening is an array was presented to you when you called
h['foo'], and you were putting a value in it, but the array was never
saved to a variable, so it went away.

With the original code try the following code, it may help you understand:
h['foo'] << 10
puts h.length
h[foo'] << 20
puts h.length

 
Reply With Quote
 
 
 
 
Ben Bleything
Guest
Posts: n/a
 
      07-19-2007
On Fri, Jul 20, 2007, stephen O'D wrote:
> So my problem is solved, but why do you have to do it like this? At
> the risk of answering my own question, is it because the block is re-
> executed everytime you access a non existent key, creating a brand new
> array object, while the first way, it just initialises the value to
> the same array each time?


The default value you provide is a reference... in this case, you say
"use this array as the default value", not "use an empty array as a
default value". To see what I mean, try this:

empty_ary = []
h = Hash.new
h.default = empty_ary

h['foo'] << 10
puts empty_ary.size

h[foo'] << 20
puts empty_ary.size

h['bar'] << 23
puts empty_ary.size

h['bar'] << 33
puts empty_ary.size

That should show you what's happening.

Ben

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
hash of hash of hash of hash in c++ rp C++ 1 11-10-2011 04:45 PM
Hash of Hash of Arrays Question Älphä Blüë Ruby 5 07-18-2009 07:36 PM
Multidimensional arrays and arrays of arrays Philipp Java 21 01-20-2009 08:33 AM
hash of arrays - appending to one of the arrays Adam Akhtar Ruby 5 03-25-2008 11:53 PM
Sort a hash based on values in the hash stored as arrays of hashes Tore Aursand Perl Misc 3 09-16-2003 10:14 AM



Advertisments