# Class variable confusion

**URL:** <https://www.ruby-forum.com/t/class-variable-confusion/166289>\
**Category:** Ruby\
**Created:** [April 23, 2009, 3:54pm UTC](https://www.ruby-forum.com/t/class-variable-confusion/166289 "2009-04-23T15:54:36Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![ksader](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/49beb7/32.png) [@ksader](https://www.ruby-forum.com/u/ksader)\
**Post date:** [April 23, 2009, 3:54pm UTC](https://www.ruby-forum.com/t/class-variable-confusion/166289/1 "2009-04-23T15:54:36Z")

</div>

Hi,

Could someone explain how i get this to work please:

module Keith  
def self.greeting  
@greeting ||= “hello”  
end  
def self.greeting=(value)  
puts “updating knowledge”  
@greeting = value  
end  
def self.speak  
puts greeting  
end  
def self.learn\_ruby  
self.greeting = “ruby”  
end  
def self.learn\_french  
learn\_language(greeting, “bonjour”)  
end  
def self.learn\_language(prop, value)  
puts prop.inspect  
prop = value  
puts prop.inspect  
#p =  
value  
end  
end

Keith.speak  
Keith.learn\_ruby  
Keith.learn\_french  
Keith.speak

This outputs:

hello  
updating knowledge  
“ruby”  
“bonjour”  
ruby

I can’t for the life of me get it to work…

many thanks  
keith

---

<div class="post-metadata">

**Author:** ![ksader](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/49beb7/32.png) [@ksader](https://www.ruby-forum.com/u/ksader)\
**Post date:** [April 23, 2009, 4:00pm UTC](https://www.ruby-forum.com/t/class-variable-confusion/166289/2 "2009-04-23T16:00:59Z")

</div>

Or more simply, i would like this to update the variable @greeting, when  
i call Keith.learn\_french:

module Keith  
def self.greeting  
@greeting ||= “hello”  
end  
def self.greeting=(value)  
puts “updating knowledge”  
@greeting = value  
end  
def self.speak  
puts greeting  
end  
def self.learn\_french  
learn\_language(greeting, “bonjour”)  
end  
def self.learn\_language(prop, value)  
prop = value  
end  
end

Keith.speak  
Keith.learn\_french  
Keith.speak

But the only way i can get it to work is using this:

module Keith  
def self.greeting  
@greeting ||= “hello”  
end  
def self.greeting=(value)  
puts “updating knowledge”  
@greeting = value  
end  
def self.speak  
puts greeting  
end  
def self.learn\_french  
self.greeting = learn\_language(greeting, “bonjour”)  
end  
def self.learn\_language(prop, value)  
prop = value  
end  
end

Keith.speak  
Keith.learn\_french  
Keith.speak

Which is basically the same as:

module Keith  
def self.greeting  
@greeting ||= “hello”  
end  
def self.greeting=(value)  
puts “updating knowledge”  
@greeting = value  
end  
def self.speak  
puts greeting  
end  
def self.learn\_french  
self.greeting = “bonjour”  
end  
end

Keith.speak  
Keith.learn\_french  
Keith.speak

---

<div class="post-metadata">

**Author:** ![ksader](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/49beb7/32.png) [@ksader](https://www.ruby-forum.com/u/ksader)\
**Post date:** [April 23, 2009, 4:23pm UTC](https://www.ruby-forum.com/t/class-variable-confusion/166289/3 "2009-04-23T16:23:08Z")

</div>

On Thu, Apr 23, 2009 at 4:01 PM, Keith S.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end  
> def self.speak  
> puts greeting  
> end  
> def self.learn\_french  
> learn\_language(greeting, “bonjour”)

Here, you are calling the greeting method (which returns “hello”)

> end  
> def self.learn\_language(prop, value)  
> prop = value

Here you are reassigning a local variable, which goes out of scope  
when the method ends.  
Try this:

jesus@jesus-laptop:~/temp/ruby$ ruby class\_variables.rb  
hello  
bonjour

jesus@jesus-laptop:~/temp/ruby$ cat class\_variables.rb  
module Keith  
def self.greeting  
@greeting ||= “hello”  
end  
def self.greeting=(value)  
puts “updating knowledge”  
@greeting = value  
end  
def self.speak  
puts greeting  
end  
def self.learn\_french  
learn\_language(:@greeting, “bonjour”)  
end  
def self.learn\_language(prop, value)  
instance\_variable\_set(prop, value)  
end  
end

Keith.speak  
Keith.learn\_french  
Keith.speak

or if you want to call the self.greeting= method, try this variation:

def self.learn\_french  
learn\_language(:greeting, “bonjour”)  
end  
def self.learn\_language(prop, value)  
send(“#{prop}=”, value)  
end

Hope this helps,

Jesus.

---

<div class="post-metadata">

**Author:** ![ksader](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/49beb7/32.png) [@ksader](https://www.ruby-forum.com/u/ksader)\
**Post date:** [April 23, 2009, 4:57pm UTC](https://www.ruby-forum.com/t/class-variable-confusion/166289/4 "2009-04-23T16:57:50Z")

</div>

Hi –

Keith S. wrote:

> JesÃºs Gabriel y GalÃ¡n wrote:
> 
> > Hope this helps,
> > 
> > Jesus.
> 
> Legend
> 
> Thankyou!!

It’s worth mentioning that none of the code in this thread contains any  
class variables. What you’ve got are instance variables (belonging to a  
class object). Class variables look like @@this.

David

---

<div class="post-metadata">

**Author:** ![ksader](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/49beb7/32.png) [@ksader](https://www.ruby-forum.com/u/ksader)\
**Post date:** [April 23, 2009, 4:38pm UTC](https://www.ruby-forum.com/t/class-variable-confusion/166289/5 "2009-04-23T16:38:52Z")

</div>

JesÃºs Gabriel y GalÃ¡n wrote:

> Hope this helps,
> 
> Jesus.

Legend

Thankyou!!

---

<div class="post-metadata">

**Author:** ![ksader](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/49beb7/32.png) [@ksader](https://www.ruby-forum.com/u/ksader)\
**Post date:** [April 23, 2009, 7:05pm UTC](https://www.ruby-forum.com/t/class-variable-confusion/166289/6 "2009-04-23T19:05:51Z")

</div>

On Apr 23, 2009, at 10:01 AM, Keith S. wrote:

> @greeting = value  
> end  
> end  
> def self.learn\_language(prop, value)
> 
> end  
> def self.learn\_french  
> self.greeting = “bonjour”  
> end  
> end
> 
> ## Keith.speak Keith.learn\_french Keith.speak
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

Keeping the other methods the same:

module Keith  
def self.learn\_french  
learn\_language(:greeting, “bonjour”)  
end  
def self.learn\_language(prop, value)  
self.send(“#{prop}=”, value)  
end  
end

irb\> Keith.speak  
hello  
=\> nil  
irb\> Keith.learn\_french  
updating knowledge  
=\> “bonjour”  
irb\> Keith.speak  
bonjour  
=\> nil

Although I’d think that you’d be better with a Speaker class and do:  
Keith = Speaker.new  
Then you’d be dealing with instance variables on instances of the  
Speaker class rather than instance variables on the Keith module.  
Contrary to what you might think, you don’t have class variables in  
your code. (Those would be @@greeting)

-Rob

Rob B. [http://agileconsultingllc.com](http://agileconsultingllc.com)  
removed\_email\_address@domain.invalid
