Displaying Hash Problems

Hi All,

just getting back into learning Ruby and thought I'd play with classes and
hashes today. Below code produces the following ouput,

mark@marklaptop:~/study/ruby$ ruby songs.rb
Enter your name
Mark
Enter song type
Rock
Enter song title
I Was Made For Loving You
Enter song artist
Kiss

TitlenewSong.get_song_titleArtistnewSong.get_song_artistTypenewSong.get_song_type

CODE:

mark@marklaptop:~/study/ruby$ cat songs.rb
##define song class
class Songs
        def set_song_type(type)
                @song_type = type
        end

        def set_song_title(title)
                @song_title = title
        end

        def set_song_artist(artist)
                @song_artist = artist
        end

        def get_song_title
                return @song_title
        end

        def get_song_type
                return @song_type
        end

        def get_song_artist
                return @song_artist
        end
end

##create user name for array name
puts "Enter your name"
aName = gets()

##create new song from class, Songs
newSong = Songs.new

puts "Enter song type"
newSong.set_song_type(gets())

puts "Enter song title"
newSong.set_song_title(gets())

puts "Enter song artist"
newSong.set_song_artist(gets())

#create new song array
aName = Hash.new
aName['Title'] = 'newSong.get_song_title'
aName['Type'] = 'newSong.get_song_type'
aName['Artist'] = 'newSong.get_song_artist'

##display array contant
puts
puts(aName)

···

--

I'm figuring it has something to do with how I assigned the values to the
keys, but, cannot for the life of me see what. Any suggestions for me for
where to look? Cheers.

Mark Sargent

"Tell me and I'll forget, show me and I may not remember, involve me, and
I'll understand."

Native American Proverb

Hi All,

I now get this,

mark@marklaptop:~/study/ruby$ ruby songs.rb
Enter your name
Mark
Enter song type
Rock
Enter song title
Wire
Enter song artist
U2

Title
Artist
Type
newSong.get_song_title
newSong.get_song_artist
newSong.get_song_type
mark@marklaptop:~/study/ruby$

for this code change,

##display array contant
puts
puts(aName.keys+aName.values)

I know I'm close. Cheers.

Mark Sargent

···

--

"Tell me and I'll forget, show me and I may not remember, involve me, and
I'll understand."

Native American Proverb

puts does funny things to arrays. try p instead.

p aName

Regards, Morton

···

On Oct 17, 2006, at 11:58 PM, Mark Sargent wrote:

Hi All,

just getting back into learning Ruby and thought I'd play with classes and
hashes today. Below code produces the following ouput,

mark@marklaptop:~/study/ruby$ ruby songs.rb
Enter your name
Mark
Enter song type
Rock
Enter song title
I Was Made For Loving You
Enter song artist
Kiss

TitlenewSong.get_song_titleArtistnewSong.get_song_artistTypenewSong.get_song_type

CODE:

mark@marklaptop:~/study/ruby$ cat songs.rb
##define song class
class Songs
       def set_song_type(type)
               @song_type = type
       end

       def set_song_title(title)
               @song_title = title
       end

       def set_song_artist(artist)
               @song_artist = artist
       end

       def get_song_title
               return @song_title
       end

       def get_song_type
               return @song_type
       end

       def get_song_artist
               return @song_artist
       end
end

##create user name for array name
puts "Enter your name"
aName = gets()

##create new song from class, Songs
newSong = Songs.new

puts "Enter song type"
newSong.set_song_type(gets())

puts "Enter song title"
newSong.set_song_title(gets())

puts "Enter song artist"
newSong.set_song_artist(gets())

#create new song array
aName = Hash.new
aName['Title'] = 'newSong.get_song_title'
aName['Type'] = 'newSong.get_song_type'
aName['Artist'] = 'newSong.get_song_artist'

##display array contant
puts
puts(aName)

--

I'm figuring it has something to do with how I assigned the values to the
keys, but, cannot for the life of me see what. Any suggestions for me for
where to look? Cheers.

Also consider:

#create new song array
aName = Hash.new ### This clobbers the previous value of aName
aName['Title'] = newSong.get_song_title
aName['Type'] = newSong.get_song_type
aName['Artist'] = newSong.get_song_artist

p aName

Regards, Morton

···

On Oct 17, 2006, at 11:58 PM, Mark Sargent wrote:

Hi All,

just getting back into learning Ruby and thought I'd play with classes and
hashes today. Below code produces the following ouput,

mark@marklaptop:~/study/ruby$ ruby songs.rb
Enter your name
Mark
Enter song type
Rock
Enter song title
I Was Made For Loving You
Enter song artist
Kiss

TitlenewSong.get_song_titleArtistnewSong.get_song_artistTypenewSong.get_song_type

CODE:

mark@marklaptop:~/study/ruby$ cat songs.rb
##define song class
class Songs
       def set_song_type(type)
               @song_type = type
       end

       def set_song_title(title)
               @song_title = title
       end

       def set_song_artist(artist)
               @song_artist = artist
       end

       def get_song_title
               return @song_title
       end

       def get_song_type
               return @song_type
       end

       def get_song_artist
               return @song_artist
       end
end

##create user name for array name
puts "Enter your name"
aName = gets()

##create new song from class, Songs
newSong = Songs.new

puts "Enter song type"
newSong.set_song_type(gets())

puts "Enter song title"
newSong.set_song_title(gets())

puts "Enter song artist"
newSong.set_song_artist(gets())

#create new song array
aName = Hash.new
aName['Title'] = 'newSong.get_song_title'
aName['Type'] = 'newSong.get_song_type'
aName['Artist'] = 'newSong.get_song_artist'

##display array contant
puts
puts(aName)

--

I'm figuring it has something to do with how I assigned the values to the
keys, but, cannot for the life of me see what. Any suggestions for me for
where to look? Cheers.

Oops, that should be: puts does funny things to arrays and hashes.

Regards, Morton

···

On Oct 18, 2006, at 12:43 AM, Morton Goldberg wrote:

puts does funny things to arrays. try p instead.

p aName

Thanx for that. I've corrected that, but the below code still won't work
correctly,

CODE OUTPUT:

mark@marklaptop:~/study/ruby$ ruby songs.rb
Enter your name
Mark
Enter song type
Rock
Enter song title
Wire
Enter song artist
U2

["Name", "Title", "Artist", "Type", "aName", "newSong.get_song_title", "
newSong.get_song_artist", "newSong.get_song_type"]

I wish to dislay like this,

Name value
Title value
Artist value
Type value

Cheers.

Mark Sargent.

CODE:

##define song class
class Songs
        def set_song_type(type)
                @song_type = type
        end

        def set_song_title(title)
                @song_title = title
        end

        def set_song_artist(artist)
                @song_artist = artist
        end

        def get_song_title
                return @song_title
        end

        def get_song_type
                return @song_type
        end

        def get_song_artist
                return @song_artist
        end
end

##create user name for array name
puts "Enter your name"
aName = gets()

##create new song from class, Songs
newSong = Songs.new

puts "Enter song type"
newSong.set_song_type(gets())

puts "Enter song title"
newSong.set_song_title(gets())

puts "Enter song artist"
newSong.set_song_artist(gets())

#create new song array
songList = Hash.new
songList['Name'] = 'aName'
songList['Title'] = 'newSong.get_song_title'
songList['Type'] = 'newSong.get_song_type'
songList['Artist'] = 'newSong.get_song_artist'

##display array contant
puts
p(songList.keys+songList.values)

···

On 10/18/06, Morton Goldberg <m_goldberg@ameritech.net> wrote:

Also consider:

#create new song array
aName = Hash.new ### This clobbers the previous value of aName
aName['Title'] = newSong.get_song_title
aName['Type'] = newSong.get_song_type
aName['Artist'] = newSong.get_song_artist

p aName

--

"Tell me and I'll forget, show me and I may not remember, involve me, and
I'll understand."

Native American Proverb

First, in this section:

#create new song array
songList = Hash.new
songList['Name'] = 'aName'
songList['Title'] = 'newSong.get_song_title'
songList['Type'] = 'newSong.get_song_type'
songList['Artist'] = 'newSong.get_song_artist'

There is no reason to have single-quotes around the right-hand side.
The single-quotes mean you want literal-strings, not the values returned
by those method calls. So, change that to:

   #create new song array
   songList = Hash.new
   songList['Name'] = aName
   songList['Title'] = newSong.get_song_title
   songList['Type'] = newSong.get_song_type
   songList['Artist'] = newSong.get_song_artist

Second, once you do that, you'll perhaps notice that all of the values
that you read in include a new-line character ("\n") at the end of them.
My guess is that you don't want those to be there, so change that earlier
section to add some calls to "chomp":

   ##create user name for array name
   puts "Enter your name"
   aName = gets().chomp

   ##create new song from class, Songs
   newSong = Songs.new

   puts "Enter song type"
   newSong.set_song_type(gets().chomp)

   puts "Enter song title"
   newSong.set_song_title(gets().chomp)

   puts "Enter song artist"
   newSong.set_song_artist(gets().chomp)

Third the call to 'p' in the final section is not going to do what you seem
to think it will do. 'p' is more of a debugging aid, and not a pretty-print
command. You give 'p' one or more objects, and it prints the result it
gets from calling the "inspect" method on each one of those objects.

##display array contant
puts
p(songList.keys+songList.values)

In this command, you're creating *one* array, where the value of that
array is the list of keys for songList, followed by the list of all values
for that songList. You're giving it one object, and it is printing out
that object. That object is a single array, so it prints out the single
array on a single line.

I am not sure what you want there, but if it were me, I woud use 'printf'
instead of 'p' for this. You might want to try an ending of:

   puts
   p(songList)
   puts
   songList.each_key { |skey|
       printf "%-8s %s\n", skey + ":", songList[skey]
   }
   puts

That will print out your value twice. I expect the second version is
pretty lose to what you're hoping for. An example run:

(117) /tmp/song_list.rb
Enter your name
gad
Enter song type
Progressive Rock
Enter song title
Arriving Somewhere but not Here
Enter song artist
Porcupine Tree

{"Name"=>"gad", "Title"=>"Arriving Somewhere but not Here",
"Artist"=>"Porcupine Tree", "Type"=>"Progressive Rock"}

Name: gad
Title: Arriving Somewhere but not Here
Artist: Porcupine Tree
Type: Progressive Rock

You could also change the line:
       printf "%-8s %s\n", skey + ":", songList[skey]
to
       printf "%-8s %s\n", skey + ":", songList[skey].inspect
to get an idea of what the 'p' command is doing for you.

···

--
Garance Alistair Drosehn = drosihn@gmail.com
Senior Systems Programmer
Rensselaer Polytechnic Institute; Troy, NY; USA