2011-03-09 9 views
8
class A 
    class << self 
    CONST = 1 
    end 
end 

puts A::CONST # this doesn't work 

¿Hay alguna manera de acceder a la constante desde fuera de la clase con esta autoclave?Constante de Ruby dentro de un método de clase

que está haciendo efectivamente esto:

class A 
    self.CONST = 1 
end 

entiendo que solo puedo mover la constante de esta llamada auto para resolver este problema fácilmente. Tengo más curiosidad sobre el funcionamiento interno del rubí.

+0

Por qué no establecer una variable de clase y usar eso? – Jimmy

Respuesta

4

No es exactamente lo que quería, pero simplemente no se han definido CONST dentro de clase A, pero en su metaclase, que por lo tanto he ahorrado una referencia a ...

class A 
    class << self 
    ::AA = self 
    CONST = 1 
    end 
end 
puts AA::CONST 
1

también, probablemente, no es exactamente lo que usted quería, ya que su referencia a la clase A en metaclass de A (que parece una especie de trampa), pero es un poco más conciso.

class A 
    class << self 
    A::CONST = 1 
    end 
end 

Para una comprensión en profundidad de lo que está pasando en este post es bastante informativo http://www.klankboomklang.com/2007/10/05/the-metaclass/

4

Su problema es que se equivoca sobre el significado del código.

class << self 
    FOO = :bar 
end 

no es equivalente a self.FOO = :bar. Es extremadamente diferente de eso. Es equivalente a self.singleton_class.const_set(:FOO, :bar).

Creo que estás asumiendo que class << self significa "asumir que hay un 'yo' implícita antes de todo lo que escribo aquí" o algo por el estilo (tal vez usted está pensando en with declaración de JavaScript). Lo que realmente hace es situarnos en el contexto de la clase singleton self, una clase especial de la cual el objeto actual es la única instancia. Entonces estás definiendo la constante en la clase singleton del objeto.

Para definir una constante de una clase, que acaba de escribir:

class Something 
    FOO = :bar 
end 
+0

¡Gracias! No veo cómo self.method y class << self son diferentes. Ambos son métodos únicos. Consulte la pregunta aquí si tiene la oportunidad: http://stackoverflow.com/questions/5508351/in-ruby-whats-the-difference-between-self-method-and-a-method-within-class-se – djburdick

Cuestiones relacionadas