A class variable is shared among all objects of a class, and it is also
accessible to the class methods that we'll describe later.
There is
only one copy of a particular class variable for a given class. Class
variable names start with two ``at'' signs, such as ``
@@count
''.
Unlike global and instance variables, class variables must be
initialized before they are used. Often this initialization is just a
simple assignment in the body of the class definition.
For example, our jukebox may want to record how many times each
particular song has been played. This count would probably be an
instance variable of the
Song
object. When a song is played, the
value in the instance is incremented. But say we also want to know
how many songs have been played in total. We could do this by
searching for all the
Song
objects and adding up their counts, or
we could risk excommunication from the Church of Good Design and use a
global variable. Instead, we'll use a class variable.
class Song
@@plays = 0
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
@plays = 0
end
def play
@plays += 1
@@plays += 1
"This song: #@plays plays. Total #@@plays plays."
end
end
|
For debugging purposes, we've arranged for
Song#play
to return a
string containing the number of times this song has been played, along
with the total number of plays for all songs. We can test this easily.
s1 = Song.new("Song1", "Artist1", 234) # test songs..
|
s2 = Song.new("Song2", "Artist2", 345)
|
s1.play
|
� |
"This song: 1 plays. Total 1 plays."
|
s2.play
|
� |
"This song: 1 plays. Total 2 plays."
|
s1.play
|
� |
"This song: 2 plays. Total 3 plays."
|
s1.play
|
� |
"This song: 3 plays. Total 4 plays."
|
Class variables are private to a class and its instances. If you want
to make them accessible to the outside world, you'll need to write an
accessor method. This method could be either an instance method or,
leading us neatly to the next section, a class method.