Alle luned2 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