Les méthodes d'Instance dans les modules
Considérons le code suivant:
module ModName
def aux
puts 'aux'
end
end
Si l'on remplace module
avec class
, nous pouvons effectuer les opérations suivantes:
ModName.new.aux
Modules ne peuvent pas être instanciées, cependant. Est-il possible d'appeler le aux
méthode sur le module?
- pour un jeter de l'utilisation, vous pouvez le faire
Object.new.extend(ModeName).aux
Vous devez vous connecter pour publier un commentaire.
Penser à ce
aux
est. Quel objet sera de répondre auxaux
? C'est une méthode d'instance, ce qui signifie que les instances de classes qui comprennent ModName de se répondre à elle. L'App module lui-même n'est pas une instance d'une telle classe. Ce serait également ne pas fonctionner si vous aviez défini ModName classe et vous ne pouvez pas appeler une méthode d'une instance sans une instance.Modules sont très bien comme les classes qui peuvent être mélangés à d'autres classes d'ajouter un comportement. Quand une classe de mélange dans un module, tous les modules de méthodes d'instance de devenir les méthodes d'instance de la classe. C'est une façon de mettre en œuvre l'héritage multiple.
Ils servent aussi comme substituts pour les espaces de noms, puisque chaque module définit un espace de noms. Mais c'est un peu différent. (Soit dit en passant, les classes ont aussi leurs propres espaces de noms, mais en faire une classe implique que vous allez créer des instances de celui-ci, de sorte qu'ils sont conceptuellement mal à cette fin.)
helper
méthode qui prend un module et le mélange dans les demandes. Si votre module méthodes ne reposent pas sur de l'état (par exemple, une fonction qui formate une chaîne de caractères passée en elle), elles peuvent également être approprié appelé de l'extérieur commeMyHelperModule.foo(bar)
. À l'aide demodule_function
(par la réponse par @JPabloFernández ci-dessous) permet à un seul module "instance" méthode pour être accédé comme l'OP demandes.Vous pouvez le faire de cette façon:
et puis il suffit de l'appeler:
extend self
est une option plus propre à la définition de chacun et de chaque méthode comme une module_function.module_funciton
, alors toute fonction ci-dessous, elle sera composée d'un module de fonction. Il fonctionne de la même manière queprivate
.Vous pouvez aussi dire
Ensuite vous pouvez inclure le module normalement, mais également d'appeler des méthodes via ModName.
En Ruby, tout est une expression, il n'y a pas de déclarations ou de déclarations. Ce qui signifie que everyhing correspond à une valeur. (Cependant, cela ne veut pas forcément dire qu'il correspond à un utile valeur. Par exemple, le
puts
méthode évalue toujours ànil
, tout comme undef
définition de la méthode d'expression (sauf dans Rubinius, où ladef
expression prend uneCompiledMethod
objet de la méthode en cours de définition).)Donc, si tout correspond à une valeur, ce qui devrait un module de définition de l'expression évaluer? Eh bien, il ya un couple de candidats: il pourrait s'évaluer à
nil
, tout comme une méthode de définition de l'expression. Ou il pourrait évaluer le module objet lui-même, après tout, ce est ce que nous définissons, à droite? Mais en fait, Il a choisi une troisième option: module (et de classe) définition des expressions réellement évaluer à ce que la dernière expression à l'intérieur du module de définition du corps donne. (Ce qui vous permet de simuler les deux autres possibilités, simplement en mettantnil
ouself
comme la dernière expression à l'intérieur d'un module de définition du corps.)Dans votre cas, la dernière expression à l'intérieur du module de définition du corps est une affectation. Mais, d'une cession? Ce que le diable ne que retour? N'est-ce pas une déclaration? Non, pas en Ruby. Tout est une expression, et les affectations sont pas une exception: l'affectation des expressions à évaluer à ce que le côté droit donne. Ici, le côté droit de la cession d'expression est une chaîne littérale, qui renvoie un objet de type string.
Ainsi, l'ensemble de définition de module expression s'évalue à la chaîne
'this is a const in module'
.Et un peu plus...
appel (sans '.nouveau"):
Y.c
fonctionne aussi bien. Vous pouvez également fairemodule Y; class << self; def c; puts "b -- c"; end; end;
et de définir::c
sur son eigenclass.