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
sí los métodos de clase module_function son públicos, pero los métodos de instancia son privadas – horseyguy
module_function "crea las funciones del módulo de los métodos mencionados. Estas funciones pueden ser llamados con el módulo como un receptor, y también están disponibles como métodos de instancia a las clases que mezclar en el módulo. Las funciones del módulo son copias del original, por lo que se pueden cambiar de forma independiente. Las versiones del método instancia se hacen privadas. Si se usan sin argumentos, los métodos definidos posteriormente se convierten en funciones del módulo. " fuente: http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_module.html#Module.module_function – mysmallidea