2010-03-01 26 views

Respuesta

52

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 
+3

sí los métodos de clase module_function son públicos, pero los métodos de instancia son privadas – horseyguy

+1

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

Cuestiones relacionadas