ruby module

include module ruby



¿Es "auto extendido" lo mismo que "module_function"? (1)

extend self y module_function son dos maneras de hacerlo de manera que pueda llamar a un método en un módulo y también llamarlo si incluye ese módulo.

¿Hay alguna diferencia entre los resultados finales de esas formas?


module_function hace que los métodos de instancia dados sean privados, luego los duplica y los coloca en la metaclase del módulo como métodos públicos. extend self agrega todos los métodos de instancia al singleton del módulo, sin modificar sus visibilidades.

module M extend self def a; end private def b; end end module N def c; end private def d; end module_function :c, :d end class O include M include N end M.a M.b # NoMethodError: private method `b'' called for M:Module N.c N.d O.new.a O.new.b # NoMethodError: private method `b'' called for O O.new.c # NoMethodError: private method `c'' called for O O.new.d # NoMethodError: private method `d'' called for O