29

Si tengo una clase con un attr_accessor, de manera predeterminada crea una variable de instancia junto con los getters y setters correspondientes. Pero, en lugar de crear una variable de instancia, ¿hay alguna manera de hacer que cree una variable de clase o una variable de instancia de clase en su lugar?¿Cómo puede el attr_accessor de Ruby producir variables de clase o variables de instancia de clase en lugar de variables de instancia?

+0

Siga su camino a través de "[Seeing Metaclasses Clearly] (http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)"; es muy útil cuando intento entender la forma en que funcionan las clases y los objetos de Ruby. –

Respuesta

46

De esta manera:

class TYourClass 
    class << self 
    attr_accessor :class_instance_variable 
    end 
end 

Puede mirar esto como la apertura de la metaclase de la clase (de los cuales la clase en sí es un ejemplo) y la adición de un atributo a la misma.

attr_accessor es un método de la clase Class, agrega dos métodos a la clase, uno que lee la variable de instancia y otro que lo establece. He aquí una posible implementación:

class Class 
    def my_attr_accessor(name) 
    define_method name do 
     instance_variable_get "@#{name}" 
    end 
    define_method "#{name}=" do |new_val| 
     instance_variable_set "@#{name}", new_val 
    end 
    end 
end 

, no está comprobado atributo de clase de acceso:

class Class 
    def class_attr_accessor(name) 
    define_method name do 
     class_variable_get "@@#{name}" 
    end 
    define_method "#{name}=" do |new_val| 
     class_variable_set "@@#{name}", new_val 
    end 
    end 
end 
+0

Gracias. Me gusta su forma de decir que abre la metaclase de la clase y agrega un apéndice. Pero, ¿por qué produce una variable de instancia de clase en lugar de una variable de clase? ¿Y sería posible hacer que produzca también una variable de clase o esta sintaxis solo funcionaría para las variables de instancia de clase? –

+0

No es diferente, ver respuesta nuevamente –

+0

Esto solo funcionará para variables de instancia de clase, b/c attr_ * define métodos para variables de instancia (de algún objeto). – rampion

20

En Rails, (o en cualquier lugar que hace require 'active_support') se puede utilizar para obtener cattr_accessor :name los descriptores de acceso variables verdadera clase.

Las variables de instancia de clase que otros han señalado suelen ser más útiles. El APIdock cattr_accessor page tiene alguna discusión útil que aclara cuándo se desea uno y no el otro, más la fuente para las funciones cattr_accessor, cattr_reader y cattr_writer.

+0

mucho más fácil - no sabía que los rieles ofrecían esto. ¡Gracias! –

Cuestiones relacionadas