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
oui méthodes de la classe module_function sont les méthodes publiques, mais l'instance sont privées – horseyguy
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