12
votes

(En rubis) permettant des méthodes de classe mixte accès aux constantes de classe

J'ai une classe avec une constante définie pour cela. J'ai ensuite une méthode de classe définie qui accède à cette classe constante. Cela fonctionne bien. Un exemple: xxx

Mon problème se pose en essayant de déplacer cette méthode de classe sur un module externe, comme: xxx

rubis interprète La méthode qui demande une constante du module, plutôt que la classe: xxx

Ainsi, quelles astuces magiques avez-vous des bourses de magie à laisser la méthode accéder à la classe constante? Merci beaucoup.


0 commentaires

3 Réponses :


16
votes

Cela semble fonctionner:

#! /usr/bin/env ruby

module CommonMethods
    def shout_my_constant
        puts self::Const.upcase
    end
end

class NonInstantiableClass
    Const = "hello, world!"
    class << self
        include CommonMethods
    end
end

NonInstantiableClass.shout_my_constant


1 commentaires

Eh bien, cela efface les choses. Je n'avais pas encore expérimenter la syntaxe :: Syntaxe :).



9
votes

Le problème est que si vous écrivez simplement const il est évalué sur le temps de création du module. Vous devez utiliser module # const_get comme ceci: const_get (: const) . Ceci est évalué au moment de l'exécution lorsque la méthode est exécutée. Donc, cela se produit dans votre classe et non dans votre module.


1 commentaires

Merci! C'était le genre de méthode que je cherchais, sans succès.



13
votes

Il convient probablement de noter que vous n'avez pas besoin d'inclure des modules dans une métaclasse.

class NonInstantiableClass
    Const = "hello, world!"
    extend CommonMethods
end


1 commentaires

Encore un autre commentaire utile. J'ai appris trois choses à poser une question.