从ruby初始化调用方法时的未定义方法

时间:2013-03-09 09:17:56

标签: ruby

我有一个继承自另一个的类。当调用子进程中的构造函数时,它正在调用父进程,该进程调用方法。对我来说应该工作得很好,但我得到一个例外。 ruby代码如下:

class MyTestClass
    def initialize
        @foo = "hello world"
        puts "init parent"
        writeFoo
    end

    def writeFoo
        puts @foo + " from base"
    end
end

class MySubClass < MyTestClass
    def initialize
        puts "init sub"
        super
    end

    def writeFoo
        puts @foo + " from sub"
        super.writeFoo
    end
end

@foo = MySubClass.new

运行该代码时,我得到一个未定义的方法异常,如下所示,但打印出正确的输出。有人可以解释一下原因吗?

/Users/tj/dev/coursera/sml/hw6/test.rb:21:in `writeFoo': undefined method `writeFoo' for nil:NilClass (NoMethodError)
    from /Users/tj/dev/coursera/sml/hw6/test.rb:5:in `initialize'
    from /Users/tj/dev/coursera/sml/hw6/test.rb:16:in `initialize'
    from /Users/tj/dev/coursera/sml/hw6/test.rb:25:in `new'
    from /Users/tj/dev/coursera/sml/hw6/test.rb:25:in `<main>'
init sub
init parent
hello world from sub
hello world from base
[Finished in 0.1s with exit code 1]

1 个答案:

答案 0 :(得分:7)

在ruby中super意味着调用当前方法的超类实现 - 与某些语言不同,它不是从基类调用任意方法的机制。

super.writeFoo

调用当前方法的超类注入(即writeFoo),然后在结果上调用writeFoo(因此出错)。