2010-07-04 9 views

Odpowiedz

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

Idealne, wielkie dzięki! – Tom

+0

Więc ... to znaczy, że nie ma sposobu, aby to zrobić bez zmiany miejsca w klasie A, która używa CONST? – nohat

+2

Tak. Stałe wyszukiwanie jest zwykle ograniczone podczas kompilacji. –

0

miałem kilka problemów z roztworu przez Konstantin Haase. Podczas uzyskiwania stałej w instancjonowanym obiekcie klasy dziedziczącej zastosowano stałą rodzicielską.

Musiałem wyraźnie odnieść się do klasy.

self.class::CONST 

okrzyki

+2

jak to się różni od jego odpowiedzi? – akostadinov

0

W przypadku ktoś uważa, że ​​to jest za pomocą modułu rozszerzenia zamiast po prostu użyć

self::CONST

1

Niestety nie mogłem dostać kod formatowania do pracy w „komentarzu "tylko w" odpowiedzi ", ale jest to odpowiedź na pytanie Akostadinowa do Hendrika" jak to się różni od jego odpowiedzi [Konstantina]? "

Przypuszczam, że Hendrik próbował uzyskać dostęp do stałej z metod w swojej klasie dziedziczenia &, która zależy od tego, czy jest to instancja, czy metoda statyczna. Wygląda na to, że zachowuje się tak, jak można się spodziewać w metodzie instancji. Ale może, a może nie, jak można się spodziewać po statycznej metodzie. Nawet jeśli to nie to, co Hendrik myśli, to może być warto zauważyć:

Jeśli masz dokładnych definicji klas jak Konstantin, ale trzeba dodać metodę do klasy A tak:

def self.print_const 
    puts CONST 
end 

Wtedy dostaniesz oba czasy:

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

jeśli jednak określić metodę w odwołując klasę:

def self.print_const 
    puts self::CONST 
end 

Otrzymasz:

A.print_const # prints A 
B.print_const # prints B 
Powiązane problemy