Array within array question

J

Josh Rowe

Hello everyone, this is my first post on this forum and I'm quite new to
ruby. My dilemma is that I've got an array which holds a whole lot of
arrays inside it and I want to print a element of one of the arrays
within the overall array. Got it? Here's an example

#!/usr/bin/env ruby
card1 = ["Ninja Monster", "monster", 1400]
card2 = ["Ninja Mage", "monster", 1600]
cdname = 0
deck = [card1,card2]
puts deck[0[cdname]]

Does anyone(I'm sure most of you) know how to get this to work with a
minimal amount of extra code.

Regards Joshua
 
S

Stefano Crocco

Hello everyone, this is my first post on this forum and I'm quite new to
ruby. My dilemma is that I've got an array which holds a whole lot of
arrays inside it and I want to print a element of one of the arrays
within the overall array. Got it? Here's an example

#!/usr/bin/env ruby
card1 = ["Ninja Monster", "monster", 1400]
card2 = ["Ninja Mage", "monster", 1600]
cdname = 0
deck = [card1,card2]
puts deck[0[cdname]]

Does anyone(I'm sure most of you) know how to get this to work with a
minimal amount of extra code.

Regards Joshua

puts deck[0][cdname]

The [] method of class array (Array#[]), which is what you actually call when
writing an_array[3] returns the object with that index in the array. In your
case, deck[0] returns the element with index 0, that is the array card1. To
retrieve the name of the card, you then access the element with index cdname
of this array, again using []. To be more explicit, you can split the above
line in two using an intermediate variable:

card = deck[0]
puts card[cdname]

However I think that using arrays to represent cards isn't the best way to go.
Arrays usually represent lists of things (for example, it's correct to use
them for a deck of cards). The contents of your cards, however, aren't lists,
since each item has a different meaning.

A better way to represent cards would be to use hashes:

card1 = {:name => "Ninja Monster", :type => "monster", :number => 1400}
card2 = {:name => "Ninja Mage", :type => "monster", :number => 1600}
deck = [card1, card2]
puts deck[0][:name]

I hope this helps

Stefano
 
J

Josh Rowe

Stefano Crocco wrote in post #976226:
puts deck[0[cdname]]

Does anyone(I'm sure most of you) know how to get this to work with a
minimal amount of extra code.

Regards Joshua

puts deck[0][cdname]

The [] method of class array (Array#[]), which is what you actually call
when
writing an_array[3] returns the object with that index in the array. In
your
case, deck[0] returns the element with index 0, that is the array card1.
To
retrieve the name of the card, you then access the element with index
cdname
of this array, again using []. To be more explicit, you can split the
above
line in two using an intermediate variable:

card = deck[0]
puts card[cdname]

However I think that using arrays to represent cards isn't the best way
to go.
Arrays usually represent lists of things (for example, it's correct to
use
them for a deck of cards). The contents of your cards, however, aren't
lists,
since each item has a different meaning.

A better way to represent cards would be to use hashes:

card1 = {:name => "Ninja Monster", :type => "monster", :number => 1400}
card2 = {:name => "Ninja Mage", :type => "monster", :number => 1600}
deck = [card1, card2]
puts deck[0][:name]

I hope this helps

Stefano

Thank you for that lightning quick response. I've just printed out some
pages on Hashes from an ebook and from what I've seen your advice seems
to be a good way to go. This game is only in early development and it's
good to make changes like this near the start. I will start changing my
other code to use hashes now. It's good to see such a great community
like this forum which has lots of people who readily give up there
expertise to help others.

Thanks again Stefano and have a good year in ruby programming!
 
R

Robert Klemme

Hello everyone, this is my first post on this forum and I'm quite new to
ruby. My dilemma is that I've got an array which holds a whole lot of
arrays inside it and I want to print a element of one of the arrays
within the overall array. Got it? Here's an example

#!/usr/bin/env ruby
card1 = ["Ninja Monster", "monster", 1400]
card2 = ["Ninja Mage", "monster", 1600]
cdname = 0
deck = [card1,card2]
puts deck[0[cdname]]

You're almost there:

puts deck[0][cdname]

Nesting does not apply to indexes. Instead you need to unnest step by
step. Hence the sequence of [idx] operations.
Does anyone(I'm sure most of you) know how to get this to work with a
minimal amount of extra code.

See above.

Cheers

robert
 
R

Robert Klemme

Hello everyone, this is my first post on this forum and I'm quite new to
ruby. My dilemma is that I've got an array which holds a whole lot of
arrays inside it and I want to print a element of one of the arrays
within the overall array. Got it? Here's an example

#!/usr/bin/env ruby
card1 = ["Ninja Monster", "monster", 1400]
card2 = ["Ninja Mage", "monster", 1600]
cdname = 0
deck = [card1,card2]
puts deck[0[cdname]]

Does anyone(I'm sure most of you) know how to get this to work with a
minimal amount of extra code.

Regards Joshua

puts deck[0][cdname]

The [] method of class array (Array#[]), which is what you actually call when
writing an_array[3] returns the object with that index in the array. In your
case, deck[0] returns the element with index 0, that is the array card1. To
retrieve the name of the card, you then access the element with index cdname
of this array, again using []. To be more explicit, you can split the above
line in two using an intermediate variable:

card = deck[0]
puts card[cdname]

However I think that using arrays to represent cards isn't the best way to go.
Arrays usually represent lists of things (for example, it's correct to use
them for a deck of cards). The contents of your cards, however, aren't lists,
since each item has a different meaning.

A better way to represent cards would be to use hashes:

card1 = {:name => "Ninja Monster", :type => "monster", :number => 1400}
card2 = {:name => "Ninja Mage", :type => "monster", :number => 1600}
deck = [card1, card2]
puts deck[0][:name]

Or even

Card = Struct.new :name, :type, :number
deck = [
Card["Ninja Monster", :monster, 1400],
Card["Ninja Mage", :monster, 1600],
]

puts deck[0].name

Note that beside using Struct to quickly create a proper class I also
used symbols as type names since you will most likely have only few of
those which repeat often and in this case symbols are more efficient
than strings.

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

Forum statistics

Threads
473,997
Messages
2,570,241
Members
46,831
Latest member
RusselWill

Latest Threads

Top