How can Ruby's attr_accessor produce class variables or class instance variables instead of instance variables? How can Ruby's attr_accessor produce class variables or class instance variables instead of instance variables? ruby ruby

How can Ruby's attr_accessor produce class variables or class instance variables instead of instance variables?


Like this:

class TYourClass  class << self    attr_accessor :class_instance_variable  endend

You can look at this as opening the metaclass of the class (of which the class itself is an instance) and adding an attribute to it.

attr_accessor is a method of class Class, it adds two methods to the class, one which reads the instance variable, and other that sets it. Here's a possible implementation:

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  endend

Completely untested class attribute accessor:

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  endend


In Rails, (or anywhere you do require 'active_support') you can use cattr_accessor :name to get the true class variable accessors.

The class instance variables that others have pointed out are usually more useful. The APIdock cattr_accessor page has some helpful discussion clarifying when you would want one not the other, plus the source to the cattr_accessor, cattr_reader and cattr_writer functions.