¿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?
¿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?
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.
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’
" 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. –
@the Tin Man: Es cierto. – vonconrad
Excelentes ejemplos: ¡gracias por escribirlos! – ckib16
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")
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)
¡Muy buena explicación! ¡Gracias! –
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"
y por defecto como se llama allí pasa a los argumentos dados a la función de los padres, así – EnabrenTane
@Enabren muy buen punto de que no se menciona. Lo agregaré – sethvargo
Además, si escribe 'super()' en lugar de 'super', no se pasarán argumentos al método principal: http://bit.ly/hsQtfD – splicer