Подтвердить что ты не робот

Ruby Inheritance - Super Инициализация получения неправильного количества аргументов

Я играю с Ruby и узнаю о методах OO и наследовании, и, наконец, я ударил ошибку, которая некоторое время ускользала от меня.

Класс персонажа

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

Класс программиста (наследуется от 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

Затем в моем главном script Он не работает в этой строке

...
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
4b9b3361

Ответ 1

вызов super с требуемыми параметрами вместо вызова super.initialize.

super(fname, lname, age, has_hat)

Ответ 2

Инициализация программиста должна быть -

def initialize(fname, lname, age, has_hat, wpm)
    super(fname, lname, age, has_hat)
    @wpm = wpm
    @known_langs = []
end