Programación de aprendizaje: ¿Cuál es la diferencia entre incluir y extender en Ruby?


Respuesta 1:
módulo chirriante
  chirrido
    "¡eep!"
  final
final

"Incluir" se mezcla en los métodos de instancia de un Módulo en el Módulo / Clase de recepción.

Cosa de clase
  incluye Squeaky
final

Thing.new.squeak
# => "¡eep!"

"Extender" se mezcla en los métodos de instancia de un Módulo en el Objeto receptor.

thing = Object.new
Extiende Squeaky
chirrido
# => "¡eep!"

Si utiliza el método de "extensión" en el contexto de una Clase, los métodos de instancia del Módulo se convertirán en "métodos de clase" porque se mezclan en la Clase, no en las instancias de la Clase.

clase OtherThing
  extender chirriante
final

OtherThing.squeak
# => "¡eep!"
OtherThing.new.squeak
# => NoMethodError (método indefinido 'chirrido')