La Coctelera

por Guillermo Álvarez

image

Diferencia entre extend e include (extend vs include)

La diferencia entre extend e include puede ser confusa a veces, por eso voy a intentar aclarar, como creo yo que es. Pero primero echemos un vistazo al rdoc

Obj.extend Mod.include



A jugar...

Vamos a poner este código de ejemplo:

 module A
   def a
     puts "Has llamado a A#a"
   end
 end
 
 module B
   def b
     puts "Has llamado a B#b"
   end
 end
 
 class C
   include A
   extend B
 end
 

La diferencia es que los métodos del módulo A son para la instancia y los métodos del módulo B son para la clase por lo que sería lo mismo que hacer:

 class D
   include A
   class << self
     include B
   end
 end
 

Esta técnica es muy usada en frameworks como merb. Cuando un objeto es incluido, se llama a:

   include InstanceMethods
   extend ClassMethods
 

Este es uno de los usos más típicos que he visto de include vs extend

Otras diferencias que me vienen a la mente son:

  1. extend es un método público, mientras que include no.
  2. Si se llama a una a extend de una instancia, es lo mismo que si la abrieses e incluyeses el módulo.

  3.  o = Object.new
     o.extend A
     class << o
       include B
     end
     
     o.a #=> Has llamado a A#a
     o.b #=> Has llamado a B#b
     

Y hasta donde yo se... no tiene mucho más misterio

30, dic | 4 comentarios Posteado por: cientifico compártelo Tags: classmethods, class, instancemethods, instance, include, extend, ruby

4 comentarios

blat 30 dic 2008 | 03:01 PM

Ahora sí que me ha quedado claro. Muuuuchas gracias!

Fernando García Samblas 15 ene 2009 | 09:28 PM

Muy guapo, a mí también me ha quedado claro (por fin!!!)

Gracias!

yo 8 mar 2010 | 08:35 PM

no entendi una teeta

Jose Pereda 29 abr 2010 | 11:38 PM

Lo unico que puedo decir al respecto es: La ejecución de un INCLUDE es OBLIGATORIA, la ejecución de un EXTEND es OPCIONAL (puede que se ejecute, como puede que no se ejecute).

Ahora el codigo no se...hay si....:(

Escribe un comentario