類變量被類的所有對象所共享,它與類方法相關聯,對一個給定的類來說,類變量只存在一份拷貝。類變量由兩個@符開頭,例如@@count。與全局變量和實例變量不同,類變量在使用之前必須被初始化。通常,初始化就是在類定義中的簡單賦值。
例如,我們的點唱機可能希望記錄每首歌被播放的次數。這個數目可能是Song對象的一個實例變量。當一首歌被播放時,實例中的值增加。但是,假如我們還想要了解下一共播放了多少首歌。通過搜索所有Song對象並累加它們的播放次數,或者冒天下之大不韙使用全局變量來完成統計;或者,讓我們使用類變量。
class Song
@@plays = 0
def initialize(name.artist,duration)
@name = name
@artlist = artist
@duration = duration
@plays = 0
end
def play
@plays += 1 #same as @plays = @plays +1
@@plays += 1
"This song:#@plays plays.Total #@@plays plays."
end
end
出於調試的目的,我們還讓Song#play 返回一個字符串,其中包括該歌曲被播放的次數,以及所有歌曲播放的總次數。我們可以很容易測試它。
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."
類變量對類及其實例都是私有的。如果你想讓它們能夠被外部世界訪問,你需要編寫訪問方法。這個方法要么是一個實例方法,或者是類方法。
有時,類需要提供不束縛於任何特定對象的方法。我們已經見過一個這樣的方法。new方法創建一個新的Song對象,但是new方法本身並不與一個特定的歌曲對象相關聯。
song = Song.new(...)
我們會發現類方法遍布於Ruby庫中。例如,File類的對象用來表示在底層文件系統中打開的一個文件。不過,File類還提供了幾個類方法來操作文件,而它們並未打開文件,因此也沒有相應的File對象。如果你想要刪除一個文件,你可以調用類方法File.delete,傳入文件名作為參數。
File.delete("dommed.txt")
類方法和實例方法是通過它們的定義區別開來的;通過在方法名之前放置類名以及一個句點,來定義類方法
class Example
def instance_method #instance method
end
def Example.class_method #class method
end
end