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.