2013-03-09 95 views
2

我有一个从另一个继承的类。在调用子进程中的构造函数时,它将调用父进程,调用方法。对我来说,应该工作得很好,但我得到一个例外。 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] 

回答

7

在红宝石super意味着调用超类实现当前方法的 - 它不像一些语言调用从基类的任意方法的机制。

super.writeFoo 

调用当前方法(即writeFoo)的超注入,然后重要的是结果(因此错误)调用writeFoo。

+0

我不确定这是什么问题。子类中的'writeFoo'工作正常。这是从'initialize'调用'writeFoo'导致的问题,我不明白为什么。一切都输出正确,但我不明白在这种情况下的错误消息。 – 2013-03-09 11:05:47

+0

这是造成这个问题。你正在调用nil.writeFoo(因为这是super调用的返回值)。将它改为“超级”,你应该没问题。 – 2013-03-09 11:28:10

+0

现在我明白你的意思了。你是完全正确的。谢谢! – 2013-03-09 11:49:07

相关问题