Tôi đang chơi với Ruby và tìm hiểu về kỹ thuật và thừa kế của OO và cuối cùng tôi đã gặp phải lỗi đã lẩn tránh tôi một thời gian.Thừa kế Ruby - Siêu khởi tạo nhận sai số đối số
Person Lớp
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
Programmer Class (được thừa hưởng từ Person)
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
Sau đó, trong kịch bản chính của tôi Đó là thất bại trên đường dây
...
programmer = Programmer.new('Frank', 'Montero', 46, false, 20)
...
này Với điều này lỗi
./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
Thông báo đặc biệt: lớp cha mẹ tôi mất không có đối số, con của nó mất một. Tôi cứ tự hỏi tại sao 'super' của đứa trẻ lại đi vào đối số của nó từ' initialize' thành 'Parent.initialize', khi tôi nhận ra rằng mình nên sử dụng' super() ', gọi rõ ràng class cha với * no arguments *. – Droogans
@Doogans: thx! super() với dấu ngoặc đơn rõ ràng khác với siêu. – JCLL