Ruby继承 - 超级初始化获取错误的参数数量

jon*_*ohn 12 ruby oop inheritance constructor

我正在玩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
Run Code Online (Sandbox Code Playgroud)

程序员类(继承人)

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
Run Code Online (Sandbox Code Playgroud)

然后在我的主脚本中,它在这一行上失败了

...
programmer = Programmer.new('Frank', 'Montero', 46, false, 20)
...
Run Code Online (Sandbox Code Playgroud)

有这个错误

./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
Run Code Online (Sandbox Code Playgroud)

Nar*_*iya 24

用所需的参数调用超级而不是调用super.initialize.

super(fname, lname, age, has_hat)
Run Code Online (Sandbox Code Playgroud)

  • 一个特别的通知:我的父班没有参数,它的孩子拿了一个.我一直想知道为什么孩子的'super`从`initialize`传递给`Parent.initialize`,当我意识到我应该使用`super()`时,它显然用*no arguments*调用父类. (10认同)