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

ho pensato che, dal momento che il metodo test dalla classe Parent utilizza immediatamente l'istruzione return, non dovrebbe essere possibile stampare la linea della classe Child. Ma è davvero stampato. Perché?L'istruzione di ritorno rubino non funziona con la parola chiave super?

Ruby 1.8.7, Mac OSX.

risposta

8

super si comporta come una chiamata al metodo che chiama l'implementazione del metodo della superclasse. Nel tuo esempio, la parola chiave return restituisce da Parent::test e continua a eseguire Child::test, proprio come qualsiasi altra chiamata di metodo.

+0

Oh .. Capisco. Ma mi chiedo, come potrei ottenere l'effetto che mi aspettavo? – Voldemort

+7

@Omega Prova 'return super'. –

+0

Posta una nuova domanda e descrivi cosa vuoi ottenere. – benzado

11

Un altro modo di pensare la chiamata a super in questo contesto è se si trattasse di qualsiasi altro metodo:

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

Se davvero si voleva evitare che la chiamata a p, è necessario utilizzare il valore restituito da super in un condizionale:

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 
Problemi correlati