Incluir se utiliza para importar código de módulo. Ruby arrojará un error cuando intentemos acceder a los métodos del módulo de importación con la clase directamente porque se importa como una subclase para la superclase. Entonces, la única forma es acceder a él a través de la instancia de la clase.
Extend también se usa para importar código de módulo, pero los extiende para importarlos como métodos de clase. Ruby arrojará un error cuando intentemos acceder a los métodos del módulo de importación con la instancia de la clase porque el módulo se importa a la superclase al igual que la instancia del módulo extendido. Entonces, la única forma es acceder a él a través de la definición de clase.
En palabras simples, la diferencia entre incluir y extender es que ‘incluir’ es para agregar métodos solo a una instancia de una clase y ‘extender’ es para agregar métodos a la clase pero no a su instancia.
Ejemplo :
# Ruby program of Include and Extend # Creating a module contains a method module Geek def geeks puts 'GeeksforGeeks!' end end class Lord # only can access geek methods # with the instance of the class. include Geek end class Star # only can access geek methods # with the class definition. extend Geek end # object access Lord.new.geeks # class access Star.geeks # NoMethodError: undefined method # `geeks' for Lord:Class Lord.geeks
Producción
GeeksforGeeks! GeeksforGeeks! main.rb:20:in `': undefined method `geeks' for Lord:Class (NoMethodError)
Si queremos importar métodos de instancia en una clase y sus métodos de clase también. Podemos ‘incluir’ y ‘extender’ al mismo tiempo.
Ejemplo :
# Ruby program to understand include and extend # Creating a module contains a method module Geek def prints(x) puts x end end class GFG # by using both include and extend # we can access them by both instances # and class name. include Geek extend Geek end # access the prints() in Geek # module by include in Lord class GFG.new.prints("Howdy") # object access # access the prints() in Geek # module by extend it in Lord class GFG.prints("GeeksforGeeks!!") # class access
Producción
Howdy GeeksforGeeks!!