私はRubyを使って遊んでいて、OOのテクニックと継承について学んでいます。しばらく私を逃したエラーを私はついに犯しました。Ruby継承 - スーパー引数の数を正しく初期化しない
人クラス
class Person
attr_accessor :fname, :lname, :age
def has_hat?
@hat
end
def has_hat=(x)
@hat = x
end
def initialize(fname, lname, age, hat)
@fname = fname
@lname = lname
@age = age
@hat = hat
end
def to_s
hat_indicator = @hat ? "does" : "doesn't"
@fname + " " + @lname + " is " + @age.to_s + " year(s) old and " + hat_indicator + " have a hat\n"
end
def self.find_hatted()
found = []
ObjectSpace.each_object(Person) { |p|
person = p if p.hat?
if person != nil
found.push(person)
end
}
found
end
end
プログラマークラス(人から継承)
require 'person.rb'
class Programmer < Person
attr_accessor :known_langs, :wpm
def initialize(fname, lname, age, has_hat, wpm)
super.initialize(fname, lname, age, has_hat)
@wpm = wpm
@known_langs = []
end
def is_good?
@is_good
end
def is_good=(x)
@is_good = x
end
def addLang(x)
@known_langs.push(x)
end
def to_s
string = super.to_s
string += "and is a " + @is_good ? "" : "not" + " a good programmer\n"
string += " Known Languages: " + @known_languages.to_s + "\n"
string += " WPM: " + @wpm.to_s + "\n\n"
string
end
end
その後、私のメインのスクリプトでは、この行にこれにより
...
programmer = Programmer.new('Frank', 'Montero', 46, false, 20)
...
を失敗していますエラー
./programmer.rb:7:in `initialize': wrong number of arguments (5 for 4) (ArgumentError)
from ./programmer.rb:7:in `initialize'
from ruby.rb:6:in `new'
from ruby.rb:6:in `main'
from ruby.rb:20
特別な注意事項:私の親クラスには、引数を取っていない、その子は1を取りました。なぜスーパークラスが*引数なし*を明示的に呼び出す 'super()'を使うべきか分かったとき、私は子供の 'super'が' initialize'から 'Parent.initialize'への引数を渡す理由を疑問に思っていました。 – Droogans
@Doogans:thx!明示的なかっこを持つsuper()はsuperとは異なります。 – JCLL