# Local state variables unique to different objects

**URL:** <https://www.ruby-forum.com/t/local-state-variables-unique-to-different-objects/163191>\
**Category:** Ruby\
**Created:** [March 18, 2009, 5:42am UTC](https://www.ruby-forum.com/t/local-state-variables-unique-to-different-objects/163191 "2009-03-18T05:42:48Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![leveille](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/a88e57/32.png) [@leveille](https://www.ruby-forum.com/u/leveille)\
**Post date:** [March 18, 2009, 5:42am UTC](https://www.ruby-forum.com/t/local-state-variables-unique-to-different-objects/163191/1 "2009-03-18T05:42:48Z")

</div>

Is there a way to get local state variables to be unique for different  
objects? See my example bank account:

class Acc  
@@balance = 100  
def withdraw( amount )  
if @@balance \>= amount  
@@balance = @@balance - amount  
else  
“Insufficient Funds”  
end  
end  
@@balance  
end

irb(main):012:0\> check1 = Acc.new  
=\> #Acc:0xb7dc2f14  
irb(main):013:0\> check1.withdraw 50  
=\> 50  
irb(main):014:0\> check1.withdraw 40  
=\> 10  
irb(main):015:0\> check1.withdraw 25  
=\> “Insufficient Funds”

This is great - but if I create a new object ‘check2’ it doesn’t start  
with a new balance of 100. What am I doing wrong here?

irb(main):016:0\> check2 = Acc.new  
=\> #Acc:0xb7db08c8  
irb(main):017:0\> check2.withdraw 40  
=\> “Insufficient Funds”  
I wanted this to return 60

---

<div class="post-metadata">

**Author:** ![leveille](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/a88e57/32.png) [@leveille](https://www.ruby-forum.com/u/leveille)\
**Post date:** [March 18, 2009, 5:58am UTC](https://www.ruby-forum.com/t/local-state-variables-unique-to-different-objects/163191/2 "2009-03-18T05:58:36Z")

</div>

Jason L. wrote:

> ```
> end
> 
> ```
> 
> end  
> @@balance  
> end

@@balance is a _class_ variable, shared by all instances of the class  
(and potentially subclasses), you probably want an instance variable:

class Acc  
def initialize bal  
@balance = bal  
end  
def withdraw( amount )  
if @balance \>= amount  
@balance = @balance - amount  
else  
“Insufficient Funds”  
end  
end  
end

acc = Acc.new 100  
puts acc.withdraw(12)  
puts acc.withdraw(120)

---

<div class="post-metadata">

**Author:** ![leveille](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/a88e57/32.png) [@leveille](https://www.ruby-forum.com/u/leveille)\
**Post date:** [March 18, 2009, 6:14am UTC](https://www.ruby-forum.com/t/local-state-variables-unique-to-different-objects/163191/3 "2009-03-18T06:14:53Z")

</div>

ah, thank you.

Interesting how in Lisp (Scheme) you have to do:

(begin (set! balance (- balance amount))  
balance)

to decrement the balance and change it’s state - using the set!
