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