2010-07-04 3 views

Antwort

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

Perfekt, vielen Dank! – Tom

+0

Also ... bedeutet dies, dass es keinen Weg gibt, dies zu tun, ohne überall in der Klasse A, die CONST verwendet, zu wechseln? – nohat

+2

Ja. Konstantes Nachschlagen wird normalerweise zur Kompilierzeit gebunden. –

0

hatte ich ein paar Probleme mit der Lösung von Konstantin Haase. Beim Zugriff auf die Konstante in einem instanziierten Objekt der erbenden Klasse wurde die übergeordnete Konstante verwendet.

Ich musste explizit auf die Klasse verweisen.

self.class::CONST 

prost

+2

Wie unterscheidet sich das von seiner Antwort? – akostadinov

0

Falls das jemand findet und stattdessen Modulerweiterung verwendet, verwenden Sie einfach

self::CONST

1

Leider habe ich den Code nicht bekommen konnte die Formatierung in einem ‚Kommentar zur Arbeit 'nur in einer' Antwort ', aber das ist eine Antwort auf die Frage von Akostadinow an Hendrik "Wie unterscheidet sich das von seiner Antwort [von Konstantin]?"

Ich würde vermuten, Hendrik versucht, die Konstante von Methoden in seiner Klasse erben & zugreifen, die davon abhängt, ob es eine Instanz oder statische Methode ist. Es scheint sich so zu verhalten, wie Sie es von einer Instanzmethode erwarten. Aber vielleicht oder vielleicht nicht, wie Sie es für eine statische Methode erwarten würden. Auch wenn das nicht das, was Hendrik gemeint, so kann dieser bemerkenswert:

Wenn Sie die genauen Klassendefinitionen wie Konstantin, aber Sie fügen Sie eine Methode zur Klasse A wie folgt aus:

def self.print_const 
    puts CONST 
end 

Dann Sie A erhalten beide Male:

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

Allerdings, wenn Sie die Methode in A definieren, indem die Klasse verweisen:

def self.print_const 
    puts self::CONST 
end 

Dann erhalten Sie:

A.print_const # prints A 
B.print_const # prints B 
Verwandte Themen