prepend y resolución de métodos
Cadenas de ancestros
prepend y resolución de métodos es una lección gratuita de Ruby Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Ruby Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Ruby Academy incluye 4 lecciones en total.
Cadenas de ancestros
Cuando llama a un método, Ruby busca en una lista llamada cadena de ancestros. La primera definición que coincide es la que se usa. Comprender esta cadena explica cómo interactúan los mixins y la herencia.
class Animal; end
class Dog < Animal; end
p Dog.ancestorsOrden de búsqueda de métodos
Ruby busca primero en la clase del objeto, después en sus módulos incluidos, luego en su superclase y así sucesivamente por la cadena hasta encontrar el método.
module M
def hello; "from module"; end
end
class C
include M
def hello; "from class"; end
end
puts C.new.helloinclude se sitúa debajo de la clase
Un módulo incluido mediante include se coloca justo debajo de la clase en la cadena. Los métodos propios de la clase tienen prioridad sobre los del módulo.
module M; end
class C
include M
end
p C.ancestors # [C, M, Object, ...]Conozca prepend
prepend inserta un módulo por encima de la clase en la cadena. Ahora los métodos del módulo se encuentran primero, antes que los propios de la clase.
module M
def hello; "from module"; end
end
class C
prepend M
def hello; "from class"; end
end
puts C.new.helloprepend en la cadena
Inspeccione los ancestros para ver que prepend coloca el módulo antes que la clase.
module M; end
class C
prepend M
end
p C.ancestors # [M, C, Object, ...]super desde un módulo añadido con prepend
Como el módulo añadido con prepend se ejecuta primero, puede envolver el método de la clase llamando a super para llegar al original. Esto resulta perfecto para decorar el comportamiento.
module Logged
def save
puts "before save"
result = super
puts "after save"
result
end
end
class Record
prepend Logged
def save
puts "saving record"
:ok
end
end
p Record.new.savesuper en los mixins
super sigue la cadena de ancestros. Desde un módulo incluido, super llega a la superclase; desde un módulo añadido con prepend, llega a la propia clase.
module Polite
def greet; "Hi! " + super; end
end
class Person
prepend Polite
def greet; "I am here."; end
end
puts Person.new.greetEnvolver sin modificar
prepend permite añadir comportamiento alrededor de métodos existentes sin modificar el código de la clase original, una alternativa limpia al monkey-patching.
module Timing
def compute(n)
puts "start"
super
end
end
class Calc
prepend Timing
def compute(n); n * n; end
end
puts Calc.new.compute(5)Orden de varios módulos
Cuando se incluyen varios módulos, el último módulo incluido queda más cerca de la clase y se busca primero.
module A; def who; "A"; end; end
module B; def who; "B"; end; end
class C
include A
include B
end
puts C.new.who # B wins (included last)
p C.ancestorsResumen de include frente a prepend
Comparación directa:
include M: la cadena es[Class, M, ...]— ganan los métodos de la clase.prepend M: la cadena es[M, Class, ...]— ganan los métodos del módulo y pueden usarsuperpara acceder a la clase.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestorsCómo encaja todo
La resolución de métodos sigue la cadena de ancestros:
- Los métodos de la clase tienen prioridad sobre los módulos incluidos.
- Los módulos añadidos con prepend tienen prioridad sobre la clase.
superavanza un paso por la cadena.
module Cap
def name; super.capitalize; end
end
class User
prepend Cap
def name; "ada"; end
end
puts User.new.nameComprobación rápida
Compruebe cuánto entiende de la resolución de métodos.
Resumen
Ha aprendido sobre la resolución de métodos:
- Ruby busca en la cadena de ancestros de arriba abajo.
includese sitúa debajo de la clase;prepend, por encima.superllega a la siguiente definición de la cadena.prependpermite envolver métodos de forma limpia.
module Loud
def speak; super.upcase; end
end
class Bot
prepend Loud
def speak; "beep"; end
end
puts Bot.new.speakPreguntas frecuentes
¿La lección «prepend y resolución de métodos» es gratis?
Sí — el texto completo de «prepend y resolución de métodos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Ruby Academy, actualiza a CoddyKit PRO. El curso de Ruby Academy incluye 4 lecciones en total.
¿Qué aprenderé en «prepend y resolución de métodos»?
Cadenas de ancestros Practicas Ruby Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Ruby Academy?
No se requiere experiencia previa. Ruby Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «prepend y resolución de métodos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Ruby Academy?
Sí. Cada lección de Ruby Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Definición de módulos
- include y extend
- Comparable y Enumerable
- prepend y resolución de métodos