2010-03-01 4 views

Répondre

52

module_function rend les méthodes d'instance données privées, puis les duplique et les place dans la métaclasse du module en tant que méthodes publiques. extend self ajoute toutes les méthodes d'instance au singleton du module, laissant leurs visibilités inchangées.

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

oui méthodes de la classe module_function sont les méthodes publiques, mais l'instance sont privées – horseyguy

+1

module_function « crée des fonctions de module pour les méthodes nommées. Ces fonctions peuvent être appelées avec le module en tant que récepteur, et deviennent également disponibles comme les méthodes d'instance aux classes Les fonctions du module sont des copies de l'original, et peuvent donc être modifiées indépendamment.Les versions de la méthode d'instance sont privées.Si elles sont utilisées sans arguments, les méthodes définies par la suite deviennent des fonctions de module. " source: http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_module.html#Module.module_function – mysmallidea

Questions connexes