Attr_accessor on class variables

attr_accessor generates accessors for instance variables. Class variables in Ruby are a very different thing, and they are usually not what you want. What you probably want here is a class instance variable. You can use attr_accessor with class instance variables like so:

class Something
  class <<self
    attr_accessor :things
  end
end

Then you can write Something.things = 12 and it will work.


Just some clarification: class variables won't be accessible using attr_accessor. It's all about instance variables:

class SomeClass
  class << self
    attr_accessor :things
  end
  @things = []
end

because in Ruby, class is an instance of the class "Class" (God, I love to say that) and attr_accessor sets accessor methods for instance variables.


attr_accessor defines accessor methods for an instance. If you want class level auto-generated accessors you could use it on the metaclass

class Parent
  @things = []

  class << self
    attr_accessor :things
  end
end

Parent.things #=> []
Parent.things << :car
Parent.things #=> [:car]

but note that this creates a class level instance variable not a class variable. This is likely what you want anyway, as class variables behave differently than you might expect when dealing w/ inheritance. See "Class and Instance Variables In Ruby".


This is probably the simplest way.

class Parent
  def self.things
    @@things ||= []
  end
end
Parent.things << :car

p Parent.things

Tags:

Ruby