Forum: Ruby local state variables unique to different objects

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Jason L. (Guest)
on 2009-03-18 06:42
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
Joel VanderWerf (Guest)
on 2009-03-18 06:58
(Received via mailing list)
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)
Jason L. (Guest)
on 2009-03-18 07:14
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!
This topic is locked and can not be replied to.