variable rails programacion privados poo polimorfismo orientada objetos multiple lenguaje instancia herencia con clases atributos ruby instance-variables class-variables class-instance-variables

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