rails - ¿Cómo puede el attr_accessor de Ruby producir variables de clase o variables de instancia de clase en lugar de variables de instancia?
ruby on rails poo (2)
Si tengo una clase con un attr_accessor
, por defecto crea una variable de instancia junto con los attr_accessor
y attr_accessor
correspondientes. Pero en lugar de crear una variable de instancia, ¿hay una manera de hacer que cree una variable de clase o una variable de instancia de clase?
En Rails, (o en cualquier lugar que require ''active_support''
) puede usar cattr_accessor :name
para obtener los cattr_accessor :name
de la verdadera variable de clase.
Las variables de instancia de clase que otros han señalado son usualmente más útiles. La página cattr_accessor de cattr_accessor
tiene algunas discusiones útiles que aclaran cuándo querría una que no sea la otra, más la fuente de las cattr_accessor
, cattr_reader
y cattr_writer
.
Me gusta esto:
class TYourClass
class << self
attr_accessor :class_instance_variable
end
end
Puede ver esto como abrir la metaclase de la clase (de la cual la clase en sí misma es una instancia) y agregarle un atributo.
attr_accessor
es un método de clase Class
, agrega dos métodos a la clase, uno que lee la variable de instancia y otro que la establece. Aquí hay 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
Accesor de atributo de clase completamente no probado:
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