Forum: Ruby Stuck on Page 27 of Programming Ruby

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Allen D. (Guest)
on 2005-12-31 22:38
HI all, this is my first post in the forum!  I got the Ruby and Rails
books for Christmas and I am having a lot of fun with them.  But I am
stuck on page 27 in Programming Ruby.  I've gotten the code from the web
site and it's not working.

Here is the code:

!#/usr/local/bin/ruby -w

class Song
  def to_s
    "Song: #@name--#@artist (#@duration)"
  end
end
song = Song.new("Bicylops", "Fleck", 260)
song.to_s

Here is my error:

ruby.rb:8:in `initialize': wrong number of arguments (3 for 0)
(ArgumentError)
        from ruby.rb:8:in `new'
        from ruby.rb:8
Alder G. (Guest)
on 2005-12-31 22:48
(Received via mailing list)
Hello Allen,

The problem appears to be with this line:

Song.new("Bicylops", "Fleck", 260)

The error message says "wrong number of arguments (3 for 0)", meaning
that
Song#initialize (the initialize method defined by "def initialize ....
end" inside the Song class) doesn't take any arguments, while in the
above
line you are in fact supplying 3 arguments to it.

So, either the problem is in the call and you're supposed to call
Song.newsans arguments:

Song.new()

Or Song#initialize got ill-defined/overriden in some problematic way.

Option #2 seems more likely; it's not logical that you can create a song
object without even a name.

Regards,
Alder G.
simonh (Guest)
on 2005-12-31 22:51
(Received via mailing list)
you need to add the code from earlier in the book. look for:

def initialize(name, artist, duration)

can't remember the exact page i'm afraid.

happy new year
Ryan L. (Guest)
on 2005-12-31 22:51
(Received via mailing list)
Hi Allen,

You need to define an initialize method which can take the arguments
you are passing to "new." For example:

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

I'm not sure if that is an oversight in the book, or if maybe the
initialize was introduced earlier and you forgot to include it.

Also you will need a "puts" before song.to_s if you expect to see any
output.

Ryan
Gavri F. (Guest)
on 2005-12-31 22:51
(Received via mailing list)
On 1/1/06, Allen D. <removed_email_address@domain.invalid> wrote:
>   def to_s
>         from ruby.rb:8:in `new'
>         from ruby.rb:8


This code should be after this:

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

You probably thought that the code you chose to execute was
independent of the code above it. In Ruby, classes are open and new
methods can be added to a class by using the 'class' keyword again and
again :)
Allen D. (Guest)
on 2005-12-31 23:26
Wow, thanks everyone for the fast replies!

That was the problem alright.

Happy New Year Everyone!!!  :-D
This topic is locked and can not be replied to.