Ruby類變量和類方法


類變量被類的所有對象所共享,它與類方法相關聯,對一個給定的類來說,類變量只存在一份拷貝。類變量由兩個@符開頭,例如@@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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM