Storing Array in Hash

J

John Bentley

I am having the most insane time with Ruby's Hash class.

I have Array's of varied length, but whenever they are stored and then
retrieved from a Hash they become length of 1 and all the values are
somehow combined in that first cell.

Code:

aRay = ["a","b","c"]
aRay2 = ["1","2","3","4","5"]

# prints out 3
puts aRay.size
# prints out 5
puts aRay2.size

# store them
h = {"letters" => aRay, "numbers" => aRay2}

# prints out abc
puts h.values_at("letters").to_s
# prints out 12345
puts h.values_at("numbers").to_s

# retrieve the arrays
ltrArray = h.values_at("letters")
numArray = h.values_at("numbers")

# prints out abc
puts ltrArray.to_s
# prints out 12345
puts numArray.to_s

# prints out 1
puts ltrArray.size
# prints out 1
puts numArray.size




What am I doing wrong?
 
L

Luc Heinrich

puts h.values_at("letters").to_s

Hash#values_at returns an array of the requested values, so in your
case you get an array of array(s).

What you want is:
ltrArray = h.values_at("letters").first
numArray = h.values_at("numbers").first
 
S

Stefano Crocco

Alle Sunday 23 November 2008, John Bentley ha scritto:
I am having the most insane time with Ruby's Hash class.

I have Array's of varied length, but whenever they are stored and then
retrieved from a Hash they become length of 1 and all the values are
somehow combined in that first cell.

Code:

aRay = ["a","b","c"]
aRay2 = ["1","2","3","4","5"]

# prints out 3
puts aRay.size
# prints out 5
puts aRay2.size

# store them
h = {"letters" => aRay, "numbers" => aRay2}

# prints out abc
puts h.values_at("letters").to_s
# prints out 12345
puts h.values_at("numbers").to_s

# retrieve the arrays
ltrArray = h.values_at("letters")
numArray = h.values_at("numbers")

# prints out abc
puts ltrArray.to_s
# prints out 12345
puts numArray.to_s

# prints out 1
puts ltrArray.size
# prints out 1
puts numArray.size




What am I doing wrong?

Try replacing lines like

puts ltrArray.to_s

with

p ltrArray

and you'll understand what's happening.

By the way, you don't need to add the .to_s to the argument of a call to puts
(or p), as puts will do that for you. Also, to display the contents of hashes
and arrays, the inspect (and the associated p) method may be more useful than
the to_s (and associated puts) method.

Stefano
 
J

John Bentley

Luc said:
What you want is:
ltrArray = h.values_at("letters").first
numArray = h.values_at("numbers").first

Oh wow...I've been plugging away at this for 4 hours now and that just
fixed my problem. Thank you so much!

I'm in the process of learning Ruby through various online mediums so I
tend to miss little intricacies like that.

Thanks again.
 
R

Robert Klemme

Oh wow...I've been plugging away at this for 4 hours now and that just
fixed my problem. Thank you so much!

I'm in the process of learning Ruby through various online mediums so I
tend to miss little intricacies like that.

A good tool to try these things out is irb which comes with your Ruby
distribution. Since irb by default uses #inspect (the same that method
"p" uses) to print out objects you can immediately see what's going on.

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top