2012-05-09 60 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 

I mimo, że ponieważ metoda z klasy Parenttest natychmiast używa instrukcji return, to nie powinno być możliwe, aby wydrukować linię klasy Child. Ale rzeczywiście jest drukowane. Dlaczego?Deklaracja zwrotu ruby ​​nie działa z super słowem kluczowym?

Ruby 1.8.7, Mac OSX.

Odpowiedz

8

super działa jak wywołanie metody, które wywołuje implementację metody nadklasy. W twoim przykładzie słowo kluczowe return powraca z Parent::test i kontynuuje wykonywanie Child::test, tak jak każde inne wywołanie metody.

+0

Och .. Rozumiem. Ale zastanawiam się, w jaki sposób osiągnąć efekt, którego oczekiwałem? – Voldemort

+7

@Omega Spróbuj 'return super'. –

+0

Opublikuj nowe pytanie i opisz, co chcesz osiągnąć. – benzado

11

Innym sposobem, aby myśleć o wywołaniu super w tym kontekście jest jakby to była jakakolwiek inna metoda:

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!" 

Jeśli naprawdę chciał zapobiec wywołanie p, trzeba użyć wartości zwracanej z super w trybie warunkowym:

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 
Powiązane problemy