Stefano Crocco
4/2/2007 9:02:00 PM
Alle lunedì 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 = 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
If you call super with no arguments, it will pass to the superclass method all
the parameters given to the sublcass method. In your case,
SubClass#initialize takes 2 arguments, while SuperClass#initialize takes no
arguments. Since you call super without arguments, ruby passes both arguments
to SuperClass#initialize, then complains because the number of arguments is
wrong. What you need to do is:
class SubClass < SuperClass
def initialize(data1, data2)
super()
...
end
...
end
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
write
attr_reader :data1, :data2
I hope this helps
Stefano