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?
Respuesta
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
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? –
No es diferente, ver respuesta nuevamente –
Esto solo funcionará para variables de instancia de clase, b/c attr_ * define métodos para variables de instancia (de algún objeto). – rampion
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
.
mucho más fácil - no sabía que los rieles ofrecían esto. ¡Gracias! –
- 1. variables de instancia de clase python y variables de clase
- 2. Variables de instancia vs. variables de clase en Python
- 3. Uso de variables de instancia en métodos de clase - Ruby
- 4. Variables de instancia de la clase Ruby y herencia
- 5. Variables de clase Ruby
- 6. Inicializando variables de instancia de clase en Ruby
- 7. ¿Diferencia entre variables de clase y variables de instancia de clase?
- 8. Obtenga todas las variables de instancia declaradas en la clase
- 9. Variables de instancia de Java contra variables locales
- 10. ¿Cómo obtener variables de instancia en Python?
- 11. ¿Inicializar automáticamente variables de instancia?
- 12. Enum como variables de instancia
- 13. Obtiene las variables attr_accessor/instance en ruby
- 14. Ruby instancia variables y métodos
- 15. Valores predeterminados de variables de instancia y variables locales
- 16. Variables de clase en Javascript
- 17. ¿Utiliza 'esto' delante de variables de instancia?
- 18. Asignación compuesta a la clase Python y variables de instancia
- 19. ¿Las variables de instancia son las nuevas variables globales?
- 20. En Ruby, ¿cómo puedo obtener variables de instancia en un hash en lugar de una matriz?
- 21. ¿Cuándo se establecen las variables de instancia de Ruby?
- 22. Variables de instancia en el diseño
- 23. iOS 5 variables de instancia
- 24. copyWithZone configurando variables de instancia?
- 25. Seguridad de subprocesos: Variables de clase en Ruby
- 26. (U) Ruby Extensions: rb_gc_mark() y variables de instancia
- 27. MSTest, MyClassInitialize y variables de instancia
- 28. Colocación de declaraciones de variables de instancia
- 29. Variables de clase dinámicas
- 30. Objective-C, variables miembro y variables de clase
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. –