2010-07-04 6 views

Répondre

69
class A 
    CONST = 'A' 

    def initialize 
    puts self.class::CONST 
    end 
end 

class B < A 
    CONST = 'B' 
end 

A.new # => 'A' 
B.new # => 'B' 
+0

Parfait, merci beaucoup! – Tom

+0

Donc ... cela signifie qu'il n'y a aucun moyen de le faire sans changer partout dans la classe A qui utilise CONST? – nohat

+2

Oui. La recherche constante est généralement liée au moment de la compilation. –

0

J'ai eu quelques problèmes avec la solution de Konstantin Haase. Lors de l'accès à la constante dans un objet instancié de la classe héritante, la constante parent a été utilisée.

Je devais me référer explicitement à la classe.

self.class::CONST 

acclamations

+2

comment est-ce différent de sa réponse? – akostadinov

0

Dans le cas où quelqu'un trouve cela et utilise l'extension du module à la place, il suffit d'utiliser

self::CONST

1

Désolé, je ne pouvais pas obtenir le formatage du code pour travailler dans un « commentaire "seulement dans une" réponse "mais ceci est en réponse à la question d'akostadinov à Hendrik" en quoi est-ce différent de sa réponse [de Konstantin]? "

Je suppose que Hendrik essayait d'accéder à la constante des méthodes dans sa classe d'héritage & qui dépend si c'est une instance ou une méthode statique. Il semble se comporter comme vous vous y attendez dans une méthode d'instance. Mais peut-être ou peut-être pas comment vous vous attendez pour une méthode statique. Même si ce n'est pas ce que Hendrik voulait dire, cela peut être intéressant de noter:

Si vous avez les définitions de classes exactes que Konstantin, mais vous ajoutez une méthode à la classe A comme ceci:

def self.print_const 
    puts CONST 
end 

Ensuite, vous obtenez un deux fois:

A.print_const # prints A 
B.print_const # prints A 

Toutefois, si vous définissez la méthode A en faisant référence à la classe:

def self.print_const 
    puts self::CONST 
end 

Ensuite, vous obtenez:

A.print_const # prints A 
B.print_const # prints B 
Questions connexes