# Is using attr\_accessor for class variables possible?

**URL:** <https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572>\
**Category:** Ruby\
**Created:** [October 7, 2007, 2:29pm UTC](https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572 "2007-10-07T14:29:26Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![mobileamusement](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mobileamusement](https://www.ruby-forum.com/u/mobileamusement)\
**Post date:** [October 7, 2007, 2:29pm UTC](https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572/1 "2007-10-07T14:29:26Z")

</div>

I know that attr\_accessor works for accessing instance variables, but  
it doesn’t seem to work for class ones. What is the best way to set/  
retrieve the value of a class variable?

Many thanks

Gabriel

---

<div class="post-metadata">

**Author:** ![mobileamusement](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mobileamusement](https://www.ruby-forum.com/u/mobileamusement)\
**Post date:** [October 7, 2007, 2:40pm UTC](https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572/2 "2007-10-07T14:40:00Z")

</div>

Hi –

On Sun, 7 Oct 2007, Gabriel D. wrote:

> I know that attr\_accessor works for accessing instance variables, but it  
> doesn’t seem to work for class ones. What is the best way to set/retrieve the  
> value of a class variable?

@@var = 1  
@@var

🙂

If you want to wrap them in methods:

class C  
def C.var  
@@var  
end

```
 def C.var=(x)
   @@var = x
 end

```

end

In Rails, there’s a thing called “cattr” that does this automatically:

class C  
cattr\_acccessor :var  
end

It’s a little misleading, though. The term “attribute” (or attr)  
refers to an attribute or property of an object. Class variables are  
very promiscuous: they’re shared among many objects (a class, its  
descendants, all instances of all of those classes), so a class  
variable is not really the right choice for an “attribute”, and “attr”  
is not the best name for wrappers around class variables.

If you want to represent state per class, the best way is to give your  
class an instance variable or accessor:

class C  
class \<\< self # C’s singleton class  
attr\_accessor :var  
end  
end

David

---

<div class="post-metadata">

**Author:** ![mobileamusement](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mobileamusement](https://www.ruby-forum.com/u/mobileamusement)\
**Post date:** [October 7, 2007, 3:05pm UTC](https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572/3 "2007-10-07T15:05:21Z")

</div>

On 7 Oct 2007, at 13:39, David A. Black wrote:

> 

Good point, I mean access the class variable from outside the class  
(above the class).

> ```
> @@var = x
> end
> 
> ```
> 
> end

I was wondering if I should do this. I just remember attr\_accessor  
was a short cut for this, but only for instance variables.

> variable is not really the right choice for an “attribute”, and “attr”  
> is not the best name for wrappers around class variables.
> 
> If you want to represent state per class, the best way is to give your  
> class an instance variable or accessor:
> 
> class C  
> class \<\< self # C’s singleton class  
> attr\_accessor :var  
> end  
> end

I read about singletons in Pragmatic Programming, not entirely sure  
how to make use of it though

Thank you very much for your advice.

Regards

Gabe

---

<div class="post-metadata">

**Author:** ![mobileamusement](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mobileamusement](https://www.ruby-forum.com/u/mobileamusement)\
**Post date:** [October 7, 2007, 3:14pm UTC](https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572/4 "2007-10-07T15:14:09Z")

</div>

Hi,

Am Sonntag, 07. Okt 2007, 21:39:24 +0900 schrieb David A. Black:

> If you want to represent state per class, the best way is to give your  
> class an instance variable or accessor:
> 
> class C  
> class \<\< self # C’s singleton class  
> attr\_accessor :var  
> end  
> end

I do this all the time. But:

class D \< C ; end

Always keep in mind that `D.var' will be something different than`C.var’.

Bertram

---

<div class="post-metadata">

**Author:** ![mobileamusement](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mobileamusement](https://www.ruby-forum.com/u/mobileamusement)\
**Post date:** [October 7, 2007, 5:29pm UTC](https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572/5 "2007-10-07T17:29:07Z")

</div>

Hi,

Am Sonntag, 07. Okt 2007, 22:56:54 +0900 schrieb David A. Black:

> > I do this all the time. But:
> > 
> > class D \< C ; end
> > 
> > Always keep in mind that `D.var' will be something different than`C.var’.
> 
> That’s the point of attr\_accessor: to give easy access to per-object  
> state.

About a month ago I found myself doing even this:

class C  
@x = “x-default”  
class \<\<self  
def x ; @x or superclass.x ; end  
end  
end

class D \< C ; end  
class E \< D ; @x = “x-special” ; end

puts C.x  
puts D.x  
puts E.x

I still don’t know what is better: using stable instance  
methods (same value on every call) or doing it this way.

Bertram

---

<div class="post-metadata">

**Author:** ![mobileamusement](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mobileamusement](https://www.ruby-forum.com/u/mobileamusement)\
**Post date:** [October 7, 2007, 3:58pm UTC](https://www.ruby-forum.com/t/is-using-attr-accessor-for-class-variables-possible/116572/6 "2007-10-07T15:58:46Z")

</div>

Hi –

On Sun, 7 Oct 2007, Bertram S. wrote:

> > end
> 
> I do this all the time. But:
> 
> class D \< C ; end
> 
> Always keep in mind that `D.var' will be something different than`C.var’.

That’s the point of attr\_accessor: to give easy access to per-object  
state.

David
