2011-12-10 2 views
3

si vous avez quelque chose comme:Comment remplacer défini? opérateur?

module Real 
    A = 1 
end 

quand vous defined?(Real::A) vous obtenez « constante » qui est une valeur de truish. Maintenant, si je fais quelque chose comme:

module Virtual 
    def self.constants 
    [:A] + super 
    end 
    def self.const_missing(sym) 
    return 1 if sym == :A 
    super 
    end 
    def self.const_defined?(sym) 
    return true if sym == :A 
    super 
    end 
end 

defined?(Virtual::A) nul retour. Y a-t-il un moyen de remplacer défini? comportement pour prendre des constantes métaprogrammées en compte?

Répondre

3

defined? est en fait un opérateur (et pas seulement du sucre syntaxique comme +) et ne peut donc pas être redéfini. La solution appropriée serait de ne pas utiliser defined? pour vérifier, mais mentionné const_defined?. defined? n'est pas destiné à la méta-programmation et fonctionne au niveau de l'analyseur, c'est pourquoi il peut donner des informations plutôt détaillées sur le type d'expression.

Questions connexes