Newbie problem: ArgumentError when creating subclass

  • Thread starter Dan Stevens (IAmAI)
  • Start date
D

Dan Stevens (IAmAI)

Could someone explain why the following code raises ArgumentError. Thanks.

class SuperClass

def initialize #Make sure you spell 'initialize' correctly!
@my_attr = 1
end

attr_reader :my_attr
end

class SubClass < SuperClass

def initialize(data1, data2)
super
@data1 = data1
@data2 = data2
end

attr_reader :data1
attr_reader :data2

end

test = SubClass.new("one", "two")
puts test.my_attr
puts test.data1
puts test.data2

$ ruby inheritance_problem.rb
inheritance_problem.rb:13:in `initialize': wrong number of arguments
(2 for 0) (ArgumentError)
from inheritance_problem.rb:13:in `initialize'
from inheritance_problem.rb:23:in `new'
from inheritance_problem.rb:23
 
R

Ryan Leavengood

Could someone explain why the following code raises ArgumentError. Thanks.

class SuperClass

def initialize #Make sure you spell 'initialize' correctly!
@my_attr = 1
end

attr_reader :my_attr
end

class SubClass < SuperClass

def initialize(data1, data2)
super

This should be super(). Without the parenthesis it defaults to passing
the arguments given to the current method to the super class's
implementation.

Ryan
 
S

Stefano Crocco

Alle luned=EC 2 aprile 2007, Dan Stevens (IAmAI) ha scritto:
Could someone explain why the following code raises ArgumentError. Thanks.

class SuperClass

def initialize #Make sure you spell 'initialize' correctly!
@my_attr =3D 1
end

attr_reader :my_attr
end

class SubClass < SuperClass

def initialize(data1, data2)
super
@data1 =3D data1
@data2 =3D data2
end

attr_reader :data1
attr_reader :data2

end

test =3D SubClass.new("one", "two")
puts test.my_attr
puts test.data1
puts test.data2

$ ruby inheritance_problem.rb
inheritance_problem.rb:13:in `initialize': wrong number of arguments
(2 for 0) (ArgumentError)
from inheritance_problem.rb:13:in `initialize'
from inheritance_problem.rb:23:in `new'
from inheritance_problem.rb:23

If you call super with no arguments, it will pass to the superclass method =
all=20
the parameters given to the sublcass method. In your case,=20
SubClass#initialize takes 2 arguments, while SuperClass#initialize takes no=
=20
arguments. Since you call super without arguments, ruby passes both argumen=
ts=20
to SuperClass#initialize, then complains because the number of arguments is=
=20
wrong. What you need to do is:

class SubClass < SuperClass
def initialize(data1, data2)
super()
...
end
...
end
=20
If SuperClass#initialized required one argument, you'd do:

def initialize(data1, data2)
super(data1)
...

By the way, you can pass more than one argument to attr_reader, so you can=
=20
write

attr_reader :data1, :data2

I hope this helps

Stefano
 
B

Bertram Scharpf

Hi,

Am Dienstag, 03. Apr 2007, 05:59:31 +0900 schrieb Ryan Leavengood:
This should be super(). Without the parenthesis it defaults to passing
the arguments given to the current method to the super class's
implementation.

Ah, parentheses do the trick. I always helped me calling

super *[]

what is not actually readable or beautiful.

Bertram
 
D

Dan Stevens (IAmAI)

Thanks all of you for clearing that up. In ruby I'm used not using
parenthesis when calling methods without parameters, but I should be
able to remember this exception :)

Hi,

Am Dienstag, 03. Apr 2007, 05:59:31 +0900 schrieb Ryan Leavengood:
This should be super(). Without the parenthesis it defaults to passing
the arguments given to the current method to the super class's
implementation.

Ah, parentheses do the trick. I always helped me calling

super *[]

what is not actually readable or beautiful.

Bertram
 

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,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top