2010-07-04 2 views

risposta

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

Perfetto, grazie mille! – Tom

+0

Quindi ... questo significa che non c'è modo di farlo senza cambiare ovunque in classe A che usa CONST? – nohat

+2

Sì. La ricerca costante è solitamente vincolata al momento della compilazione. –

0

Ho avuto alcuni problemi con la soluzione di Konstantin Haase. Quando si accede alla costante in un oggetto istanziato della classe ereditaria, è stata utilizzata la costante padre.

Ho dovuto fare esplicitamente riferimento alla classe.

self.class::CONST 

applausi

+2

come è diverso dalla sua risposta? – akostadinov

0

Nel caso in cui qualcuno trova questo e sta usando il modulo di estensione, invece, basta usare

self::CONST

1

Spiacente non ho potuto ottenere il codice di formattazione di lavorare in un 'commento 'solo in una' risposta ', ma questo è in risposta alla domanda di Akostadinov a Hendrik "com'è diverso dalla sua risposta [di Konstantin]?"

Direi che Hendrik stava cercando di accedere alla costante dai metodi nella sua classe ereditaria & che dipende dal fatto che si tratti di un'istanza o di un metodo statico. Sembra comportarsi come ci si aspetterebbe in un metodo di istanza. Ma forse o forse non come ti aspetteresti per un metodo statico. Anche se questo non è quello che voleva dire Hendrik, questo può essere la pena di notare:

Se si hanno le definizioni esatte di classe come Konstantin, ma si aggiunge un metodo per classe A in questo modo:

def self.print_const 
    puts CONST 
end 

Poi si ottiene un entrambe le volte:

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

Tuttavia, se si definisce il metodo in un facendo riferimento alla classe:

def self.print_const 
    puts self::CONST 
end 

Quindi si ottiene:

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