# Idiom for Class variables

**URL:** <https://www.ruby-forum.com/t/idiom-for-class-variables/169370>\
**Category:** Rails\
**Created:** [June 2, 2009, 10:31pm UTC](https://www.ruby-forum.com/t/idiom-for-class-variables/169370 "2009-06-02T22:31:01Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![byrnejb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/d2c977/32.png) [@byrnejb](https://www.ruby-forum.com/u/byrnejb)\
**Post date:** [June 2, 2009, 10:31pm UTC](https://www.ruby-forum.com/t/idiom-for-class-variables/169370/1 "2009-06-02T22:31:01Z")

</div>

I want do do something like this

class MyClass

def default  
self.default  
end

def self.default  
return @@default if @@default  
self.default = ‘this’  
end

def self.default=(value)  
@@default = value  
end  
end

a = MyClass.new  
=\> nil  
a.default  
=\> “this”

But, this does not work. What is the idiom to get this to happen?

---

<div class="post-metadata">

**Author:** ![byrnejb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/d2c977/32.png) [@byrnejb](https://www.ruby-forum.com/u/byrnejb)\
**Post date:** [June 2, 2009, 11:14pm UTC](https://www.ruby-forum.com/t/idiom-for-class-variables/169370/2 "2009-06-02T23:14:24Z")

</div>

On Jun 2, 9:31 pm, James B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> I want do do something like this
> 
> class MyClass
> 
> def default  
> self.default  
> end

this creates an infinite recursion - self.default doesn’t call the  
class method, it’s equivalent to writing

def default  
default  
end

which obviously doesn’t work.

You could write  
def default  
MyClass.default  
end

or, equivalently

def default  
self.class.default  
end

the code as is won’t quite work, since ruby will complain if you try  
to access an unset class variable, so you need some thing like

class MyClass  
@@default = 'this  
…  
end

@@ variables are visible by instances as well as classes though, so  
you could also do

def default  
@@default  
end

Lastly, active support already includes the cattr\_accessor helper that  
will create accessors for you

Fred

---

<div class="post-metadata">

**Author:** ![byrnejb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/d2c977/32.png) [@byrnejb](https://www.ruby-forum.com/u/byrnejb)\
**Post date:** [June 3, 2009, 9:28pm UTC](https://www.ruby-forum.com/t/idiom-for-class-variables/169370/3 "2009-06-03T21:28:52Z")

</div>

I found this subject well explained in this rather enlightening post  
attributed to DHH:

[http://groups.google.com/group/rubyonrails-talk/browse\_thread/thread/51023b181ab950dc](http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/51023b181ab950dc)

---

<div class="post-metadata">

**Author:** ![byrnejb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/d2c977/32.png) [@byrnejb](https://www.ruby-forum.com/u/byrnejb)\
**Post date:** [June 3, 2009, 4:03pm UTC](https://www.ruby-forum.com/t/idiom-for-class-variables/169370/4 "2009-06-03T16:03:54Z")

</div>

Frederick C. wrote:

> Lastly, active support already includes the cattr\_accessor helper that  
> will create accessors for you

Ahh, I had run across this before but I could not remember what it was  
called or where it was found. Thanks for the lucid explanation about  
the rest of it as well.

Regards,
