2010-07-04 17 views
26

bir geçersiz kılınmış sabiti nasıl kullanılır:Bu kodu verilen bir inheritanced sınıfta

class A 
    CONST = 'A' 

    def initialize 
    puts CONST 
    end 
end 

class B < A 
    CONST = 'B' 
end 

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

Ben CONST = 'B' tanımını kullanmak B istiyorum, ama nasıl olduğunu bilmiyorum. Herhangi bir fikir?

Selamlar

Tom

cevap

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

Mükemmel, çok teşekkürler! – Tom

+0

Yani ... bu, CONST kullanan A sınıfındaki her yeri değiştirmeden bunu yapmanın bir yolu olmadığı anlamına geliyor. – nohat

+2

Evet. Sabit arama genellikle derleme zamanında ciltlenir. –

0

Ben Konstantin Haase çözümü ile bazı sorunlar vardı. Devralma sınıfının somutlaşmış bir nesnesinde sabite erişildiğinde, ana sabit kullanılmıştır.

Açıkça sınıfa başvurmak zorunda kaldım.

self.class::CONST 

şerefe

kimse yerine modül uzantı kullanıyor bu bulur ve durumda
+2

Bu onun cevabından nasıl farklı? – akostadinov

0

, sadece bir 'yorumunda çalışmaya biçimlendirme kodu alamadım

self::CONST

1

Maalesef kullanmak 'sadece' bir cevapta 'ama bu akostadinov'un sorusuna cevap olarak Hendrik'e "Bu, onun [Konstantin'in] yanıtından farklı mıdır?"

Hendrik'in, bir örnek mi, yoksa statik bir yönteme mi bağlı olduğuna göre, miras sınıfındaki & sınıfındaki yöntemlerden sabit erişmeye çalıştığını tahmin ediyorum. Bir örnek yönteminde beklediğiniz gibi davranıyor gibi görünüyor. Ama belki de belki de statik bir yöntem için nasıl beklemezsiniz. o Hendrik anlamına gelmez ne bile, bu dikkati olabilir:

Eğer Konstantin tam olarak sınıf tanımları var, ama böyle sınıf A'ya bir yöntem eklerseniz:

def self.print_const 
    puts CONST 
end 

Sonra A almak iki kere: Ancak

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

Sınıf'ı başvurarak A yöntemini tanımlamak edin:

def self.print_const 
    puts self::CONST 
end 

Öyleyse şu şekilde olsun:

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