Ruby beginner question

A

Alucard

Hello

I am very new to Ruby and currently install Ruby 1.82.15

My question, what's wrong with the following code?

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
puts "Song: #{@name}--#{@artist} (#{@duration})"
end
end
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end

def to_s
super + " [#{@lyrics}]"
end
end
aSong = KaraokeSong.new("KSongName", "KSongArtist", 225, "Klyrics")
aSong.to_s

The error is:
Song: KSongName--KSongArtist (225)
song.rbw:33:in `to_s': undefined method `+' for nil:NilClass
(NoMethodError)
from song.rbw:37

Please help!

Thanks in advance
 
C

chris

Alucard said:
Hello

I am very new to Ruby and currently install Ruby 1.82.15

My question, what's wrong with the following code?

New to ruby too, but it looks like you're calling + on "super" and on a
string.

Try super.to_s + " [#{@lyrics}]" in to_s
 
A

Ara.T.Howard

Hello

I am very new to Ruby and currently install Ruby 1.82.15

My question, what's wrong with the following code?

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
puts "Song: #{@name}--#{@artist} (#{@duration})"
end
end
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end

def to_s
super + " [#{@lyrics}]"
end
end
aSong = KaraokeSong.new("KSongName", "KSongArtist", 225, "Klyrics")
aSong.to_s

The error is:
Song: KSongName--KSongArtist (225)
song.rbw:33:in `to_s': undefined method `+' for nil:NilClass
(NoMethodError)
from song.rbw:37

Please help!

Thanks in advance

super doesn't return a string - you've got

def to_s
puts "Song: #{@name}--#{@artist} (#{@duration})"
end

it returns nil (the return value of puts). try

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end

hth. and welcome aboard!

-a
--
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| Your life dwells amoung the causes of death
| Like a lamp standing in a strong breeze. --Nagarjuna
===============================================================================
 
J

Joshua Haberman

Hello

I am very new to Ruby and currently install Ruby 1.82.15

My question, what's wrong with the following code?

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
puts "Song: #{@name}--#{@artist} (#{@duration})"

Omit the "puts": you want to return the string, not print it!

Josh
 
A

Alexandru Popescu

#: chris changed the world a bit at a time by saying on 8/20/2005 7:51 PM :#
Alucard said:
Hello

I am very new to Ruby and currently install Ruby 1.82.15

My question, what's wrong with the following code?

New to ruby too, but it looks like you're calling + on "super" and on a
string.

Try super.to_s + " [#{@lyrics}]" in to_s

I think you should write it:

class Song
[....]

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end
end

class KaraokeSong
[...]
def to_s
super + + " [#{@lyrics}]"
end

end

[...]
puts aSong.to_s

:alex |.::the_mindstorm::.|
 
A

Alexandru Popescu

#: Alexandru Popescu changed the world a bit at a time by saying on 8/20/2005 8:09 PM :#
#: chris changed the world a bit at a time by saying on 8/20/2005 7:51 PM :#
I think you should write it:

class Song
[....]

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end
end

class KaraokeSong
[...]
def to_s
super + + " [#{@lyrics}]"
end

end

[...]
puts aSong.to_s

:alex |.::the_mindstorm::.|

definitely no double +, just one +. as it was already explained Song#to_s should return a string,
while the initial Song#to_s is just printing one and returning nil.

:alex |.::the_mindstorm::.|
 
A

Alucard

Hi all,

thanks all your reply. It works using the following code. Thanks
again for input and suggestions!

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end
end

class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end

def to_s
super + " [#{@lyrics}]"
end
end
aSong = KaraokeSong.new("KSongName", "KSongArtist", 225, "Klyrics")
puts aSong.to_s
 

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,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top