# Ruby Class Variables

**URL:** <https://www.ruby-forum.com/t/ruby-class-variables/90865>\
**Category:** Rails\
**Created:** [April 2, 2007, 3:50pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865 "2007-04-02T15:50:15Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![jamal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/35a633/32.png) [@jamal](https://www.ruby-forum.com/u/jamal)\
**Post date:** [April 2, 2007, 3:50pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865/1 "2007-04-02T15:50:15Z")

</div>

Hello,

I’m little confused about class variables

class Polygon  
attr\_accessor :sides  
@@sides = 10  
end

p Polygon.new.sides

I get nil as return from sides??

but when I do this

class Polygon  
@@sides = 10  
def sides  
@@sides  
end  
end

This work, but then I need to write all the accessors for every global  
variable?

Regards,  
Jamal

---

<div class="post-metadata">

**Author:** ![jamal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/35a633/32.png) [@jamal](https://www.ruby-forum.com/u/jamal)\
**Post date:** [April 2, 2007, 4:19pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865/2 "2007-04-02T16:19:39Z")

</div>

You want #cattr\_accessor

attr\_accessor gives you:

def var; @var; end  
def var=(val); @var = val; end

while cattr\_accessor gives you:

def self.var; @@var; end  
def self.var=(val); @@var = val; end

Which also means that you will normally do Polygon.sides.

Jason

---

<div class="post-metadata">

**Author:** ![jamal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/35a633/32.png) [@jamal](https://www.ruby-forum.com/u/jamal)\
**Post date:** [April 2, 2007, 4:46pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865/3 "2007-04-02T16:46:42Z")

</div>

Jason R. wrote:

> You want #cattr\_accessor
> 
> attr\_accessor gives you:
> 
> def var; @var; end  
> def var=(val); @var = val; end
> 
> while cattr\_accessor gives you:
> 
> def self.var; @@var; end  
> def self.var=(val); @@var = val; end
> 
> Which also means that you will normally do Polygon.sides.
> 
> Jason

Well I don’t want to write the set and get, I tought with attr\_accessor  
they write it for you?

---

<div class="post-metadata">

**Author:** ![jamal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/35a633/32.png) [@jamal](https://www.ruby-forum.com/u/jamal)\
**Post date:** [April 2, 2007, 4:57pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865/4 "2007-04-02T16:57:43Z")

</div>

attr\_accessor writes out set/get for instance variables.

cattr\_accessor writes out set/get for class variables.

Use those, and you don’t have to write out your own set/get

Jason

---

<div class="post-metadata">

**Author:** ![jamal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/35a633/32.png) [@jamal](https://www.ruby-forum.com/u/jamal)\
**Post date:** [April 2, 2007, 5:00pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865/5 "2007-04-02T17:00:35Z")

</div>

Jason R. wrote:

> attr\_accessor writes out set/get for instance variables.
> 
> cattr\_accessor writes out set/get for class variables.
> 
> Use those, and you don’t have to write out your own set/get
> 
> Jason

Thanks Jason R. 😃

---

<div class="post-metadata">

**Author:** ![jamal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/35a633/32.png) [@jamal](https://www.ruby-forum.com/u/jamal)\
**Post date:** [April 2, 2007, 5:03pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865/6 "2007-04-02T17:03:11Z")

</div>

Jason R. wrote:

> attr\_accessor writes out set/get for instance variables.
> 
> cattr\_accessor writes out set/get for class variables.
> 
> Use those, and you don’t have to write out your own set/get
> 
> Jason

I actually just try it out, undefined method cattr\_accesstor?

class Link

cattr\_accessor :url, :response

def initialize(url)  
@@url = URI::parse(url)  
@@response = Net::HTTP.get(@@url)  
end

end

link = Link.new(“[http://www.google.com/](http://www.google.com/)”)  
p link.response

---

<div class="post-metadata">

**Author:** ![jamal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/35a633/32.png) [@jamal](https://www.ruby-forum.com/u/jamal)\
**Post date:** [April 2, 2007, 5:36pm UTC](https://www.ruby-forum.com/t/ruby-class-variables/90865/7 "2007-04-02T17:36:47Z")

</div>

On 4/2/07, Jamal S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end
> 
> link = Link.new(“[http://www.google.com/](http://www.google.com/)”)  
> p link.response

Hmm, as you are posting to the Rails mailing list, I assumed the Rails  
environment. You can include ActiveSupport for yourself to use these  
methods.

require ‘rubygems’  
require ‘active\_support’

Jason
