la définition du module évalue à «c'est ...', Pourquoi?
Dans Ruby, tout est une expression, il n'y a pas d'instructions ou de déclarations. Ce qui signifie que everyhing évalue à une valeur. (Cependant, cela ne signifie pas nécessairement qu'il évalue à un utile valeur. Par exemple, la méthode puts
évalue toujours nil
, comme une expression de définition de la méthode def
(sauf dans Rubinius, où l'expression def
évalue à un CompiledMethod
objet pour la méthode en cours de définition.)
Donc, si tout évalue à une valeur, à quoi devrait évaluer une expression de définition de module? Eh bien, il y a un couple de candidats: il pourrait évaluer à nil
, tout comme une expression de définition de méthode. Ou il pourrait évaluer à l'objet module lui-même, après tout, ce est ce que nous définissons, non? Mais en réalité, Matz a choisi une troisième option: les expressions de définition de module (et de classe) évaluent en fait à quel que soit l'évaluation de la dernière expression dans le corps de définition de module. (Cela vous permet de simuler facilement les deux autres possibilités en mettant simplement nil
ou self
comme dernière expression dans un corps de définition de module.)
Dans votre cas, la dernière expression dans le corps de définition de module est une affectation. Mais, une mission? Que diable ne que retourner? N'est-ce pas une déclaration? Non, pas en Ruby. Tout est une expression, et les affectations ne font pas exception: les expressions d'affectation évaluent tout ce que le côté droit évalue. Ici, le côté droit de l'expression d'affectation est un littéral de chaîne, qui évalue un objet chaîne. Par conséquent, l'expression de définition de module entière est évaluée par rapport à la chaîne 'this is a const in module'
.
pour une utilisation jetable, vous pouvez le faire 'Object.new.extend (ModeName) .aux' – AJcodez