Storing Array in Hash

Discussion in 'Ruby' started by John Bentley, Nov 23, 2008.

  1. John Bentley

    John Bentley Guest

    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?
    --
    Posted via http://www.ruby-forum.com/.
    John Bentley, Nov 23, 2008
    #1
    1. Advertising

  2. John Bentley

    Luc Heinrich Guest

    On 23 nov. 08, at 15:13, John Bentley wrote:

    > 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

    --
    Luc Heinrich -
    Luc Heinrich, Nov 23, 2008
    #2
    1. Advertising

  3. 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
    Stefano Crocco, Nov 23, 2008
    #3
  4. John Bentley

    John Bentley Guest

    Luc Heinrich wrote:
    > 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.
    --
    Posted via http://www.ruby-forum.com/.
    John Bentley, Nov 23, 2008
    #4
  5. On 23.11.2008 15:24, John Bentley wrote:
    > Luc Heinrich wrote:
    >> 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.


    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
    Robert Klemme, Nov 23, 2008
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. rp
    Replies:
    1
    Views:
    480
    red floyd
    Nov 10, 2011
  2. Anthony Martinez
    Replies:
    4
    Views:
    256
    Robert Klemme
    Jun 11, 2007
  3. Michal Suchanek
    Replies:
    6
    Views:
    212
    Nobuyoshi Nakada
    Jun 13, 2007
  4. Srijayanth Sridhar
    Replies:
    19
    Views:
    582
    David A. Black
    Jul 2, 2008
  5. Colvin
    Replies:
    3
    Views:
    162
    Colvin
    Dec 30, 2003
Loading...

Share This Page