2012-05-09 8 views
11
class Parent 
    def test 
    return 
    end 
end 

class Child < Parent 
    def test 
    super 
    p "HOW IS THIS POSSIBLE?!" 
    end 
end 

c = Child.new 
c.test 

ich aber, dass, da die test Methode aus der Klasse Parent sofort die return-Anweisung verwendet, sollte es nicht möglich sein, die Linie der Child Klasse zu drucken. Aber es ist tatsächlich gedruckt. Warum das?Ruby Return-Anweisung funktioniert nicht mit Super-Schlüsselwort?

Ruby 1.8.7, Mac OSX.

Antwort

8

super verhält sich wie ein Methodenaufruf, der die Methodenimplementierung der Superklasse aufruft. In Ihrem Beispiel kehrt das Schlüsselwort return von Parent::test zurück und führt die Ausführung von Child::test aus, genau wie jeder andere Methodenaufruf auch.

+0

Oh .. Ich verstehe. Aber ich frage mich, wie ich den Effekt erzielen würde, den ich erwartet habe? – Voldemort

+7

@Omega Versuchen Sie 'Rückkehr Super'. –

+0

Stellen Sie eine neue Frage und beschreiben Sie, was Sie erreichen möchten. – benzado

11

Eine andere Möglichkeit, den Anruf zu super in diesem Zusammenhang zu denken ist, wenn es in einem anderen Verfahren waren:

class Parent 
    def foo 
    return 
    end 
end 

class Child < Parent 
    def test 
    foo 
    p "THIS SEEMS TOTALLY REASONABLE!" 
    end 
end 

c = Child.new 
c.test 
# => "THIS SEEMS TOTALLY REASONABLE!" 

Wenn Sie wirklich den Anruf zu p verhindern wollten, müssen Sie den Rückgabewert verwenden, super in einem Zustand:

class Parent 
    def test 
    return 
    end 
end 

class Child < Parent 
    def test 
    p "THIS SEEMS TOTALLY REASONABLE!" if super 
    end 
end 

c = Child.new 
c.test 
# => nil 
Verwandte Themen