0Pricing
Ruby Academy · Lección

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.ancestors

Orden 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.hello

include 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.hello

prepend 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.save

super 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.greet

Envolver 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.ancestors

Resumen 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 usar super para acceder a la clase.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestors

Có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.
  • super avanza 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.name

Comprobació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.
  • include se sitúa debajo de la clase; prepend, por encima.
  • super llega a la siguiente definición de la cadena.
  • prepend permite 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.speak

Preguntas 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

  1. Definición de módulos
  2. include y extend
  3. Comparable y Enumerable
  4. prepend y resolución de métodos
← Volver a Ruby Academy