2010-07-04 20 views

Respuesta

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

Perfecto, muchas gracias! – Tom

+0

Entonces, ¿esto significa que no hay forma de hacerlo sin cambiar en todas partes en la clase A que usa CONST? – nohat

+2

Sí. La búsqueda constante generalmente se vincula en el momento de la compilación. –

0

tuve algunos problemas con la solución de Konstantin Haase. Al acceder a la constante en un objeto instanciado de la clase heredada, se utilizó la constante primaria.

Tuve que referirme explícitamente a la clase.

self.class::CONST 

aplausos

+2

¿En qué se diferencia esto de su respuesta? – akostadinov

0

En caso de que alguien encuentra esto y está utilizando la extensión del módulo en su lugar, sólo tiene que utilizar

self::CONST

1

Siento no haber podido obtener el código de formato a trabajar en un 'comentario 'solo en una' respuesta ', pero esto es en respuesta a la pregunta de Akostadinov a Hendrik "¿En qué se diferencia esto de la respuesta de [Konstantin]?"

Supongo que Hendrik estaba intentando acceder a la constante desde los métodos en su clase heredada & que depende de si es una instancia o método estático. Parece comportarse como esperarías en un método de instancia. Pero tal vez o tal vez no sea lo que esperarías de un método estático. Incluso si eso no es lo que quería decir Hendrik, esto puede ser vale la pena destacar:

Si tiene las definiciones de clase exactas como Konstantin, pero se agrega un método a la clase A de la siguiente:

def self.print_const 
    puts CONST 
end 

Entonces usted consigue una en ambas ocasiones:

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

Sin embargo, si se define el método en una haciendo referencia a la clase:

def self.print_const 
    puts self::CONST 
end 

Luego obtienes:

A.print_const # prints A 
B.print_const # prints B 
Cuestiones relacionadas