2

別のクラスから継承するクラスがあります。子のコンストラクターを呼び出すときは、親を呼び出し、メソッドを呼び出します。私にとってはそれは完全にうまくいくはずですが、例外があります。ルビーコードは次のようになります。

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]
4

1 に答える 1

7

ルビーsuperとは、現在のメソッドのスーパークラス実装を呼び出すことを意味します。一部の言語とは異なり、基本クラスから任意のメソッドを呼び出すメカニズムではありません。

super.writeFoo

現在のメソッドのスーパークラスの埋め込みを呼び出し(つまりwriteFoo)、その結果に対してwriteFooを呼び出します(したがってエラー)。

于 2013-03-09T09:31:07.810 に答える