2011-01-08 11 views
41

¿Para qué sirve este código?Súper palabra clave en Ruby

def initialize options = {}, &block 
    @filter = options.delete(:filter) || 1 
    super 
end 

Por lo que yo sé, es como llamar a la función recursivamente, ¿verdad?

Respuesta

54

no ... super llama al método de la clase principal, si existe. Además, como señaló @EnabrenTane, pasa todos los argumentos al método de la clase padre también.

+9

y por defecto como se llama allí pasa a los argumentos dados a la función de los padres, así – EnabrenTane

+1

@Enabren muy buen punto de que no se menciona. Lo agregaré – sethvargo

+39

Además, si escribe 'super()' en lugar de 'super', no se pasarán argumentos al método principal: http://bit.ly/hsQtfD – splicer

49

super llama a un método padre del mismo nombre, con los mismos argumentos. Es muy útil usarlo para clases heredadas.

He aquí un ejemplo:

class Foo 
    def baz(str) 
    p 'parent with ' + str 
    end 
end 

class Bar < Foo 
    def baz(str) 
    super 
    p 'child with ' + str 
    end 
end 

Bar.new.baz('test') # => 'parent with test' \ 'child with test' 

No hay límite al número de veces que se puede llamar super, por lo que es posible utilizarlo con múltiples clases heredadas, como esto:

class Foo 
    def gazonk(str) 
    p 'parent with ' + str 
    end 
end 

class Bar < Foo 
    def gazonk(str) 
    super 
    p 'child with ' + str 
    end 
end 

class Baz < Bar 
    def gazonk(str) 
    super 
    p 'grandchild with ' + str 
    end 
end 

Baz.new.gazonk('test') # => 'parent with test' \ 'child with test' \ 'grandchild with test' 

Si hay Sin método padre del mismo nombre, sin embargo, Ruby plantea una excepción:

class Foo; end 

class Bar < Foo 
    def baz(str) 
    super 
    p 'child with ' + str 
    end 
end 

Bar.new.baz('test') # => NoMethodError: super: no superclass method ‘baz’ 
+5

" super llama a un método principal del mismo nombre, con los mismos argumentos ". Un * supernatural * 'super' los llama con los mismos argumentos. No hay nada que diga que el niño no puede pasar un subconjunto de los parámetros al padre si eso es lo que el padre toma. –

+0

@the Tin Man: Es cierto. – vonconrad

+0

Excelentes ejemplos: ¡gracias por escribirlos! – ckib16

16

La palabra clave super se puede usar para llamar a un método del mismo nombre en la superclase de la clase que realiza la llamada.

Pasa todos los argumentos al método de clase principal.

súper no es igual que súper()

class Foo 
    def show 
    puts "Foo#show" 
    end 
end 

class Bar < Foo 
    def show(text) 
    super 

    puts text 
    end 
end 


Bar.new.show("Hello Ruby") 

ArgumentError: número incorrecto de argumentos (1 a 0)

super (sin paréntesis) dentro de la subclase método parent llamarán con exactamente los mismos argumentos que se pasaron al método original (por lo que súper dentro de Bar # show se convierte en super ("Hello Ruby") y provoca un error porque el método principal no toma ningún argumento)

+0

¡Muy buena explicación! ¡Gracias! –

0

Bono:

module Bar 
    def self.included base 
     base.extend ClassMethods 
    end 

    module ClassMethods 
     def bar 
      "bar in Bar" 
     end 
    end 
end 

class Foo 
    include Bar 
    class << self 
     def bar 
      super 
     end 
    end 
end 

puts Foo.bar # => "bar in Bar"