天天看點

ruby中類的寫法以及屬性,執行個體變量,類方法的用法

Ruby中類的寫法
 定義一個class
 class Song
  def initialize(name,artist,duration)
    @name = name
    @artist = artist
    @duration = duration
  end
 end
 定義了一個歌曲Song類,類名首字母要大寫,@開頭為執行個體變量
 initialize相當于java中的構造函數,在建立對象的時候會調用此函數,傳入參數
 song = Song.new("往前一步","孟非",240)
 song.inspect 預設将對象的id和執行個體變量格式化
 inspect輸出地格式不合适,ruby中可以給類重寫to_s方法(有點像java中的toString())
 class Song
  def to_s
    "Song:#@name--#@artist(#@duration)"
  end
  song.to_s就可以輸出定義好的格式
 
  (2)類的繼承
      現在需要給歌曲添加歌詞
      class KoraokeSong < Song
        def initialize(name,artist,duration,lyrics)
          super(name,artist,duration)
          @lyrics = lyrics
        end
      end
     67頁
    (3)對象和屬性
     一個類的完整寫法:
     class Song
       def initialize(name,artist,duration)#構造器
         @name = name
         @artist = artist
         @duration = duration
       end
       #讀寫屬性,相當于java中的getter,setter
       attr_reader :name,:artist,:duration
       attr_writer :name,:artist,:duration
       #getter/setter的另外一種寫法
       #def name
       #  @name
       #end
       #def artist
       #  @artist
       #end
       #def duration
       #  @duration
       #end
       #setter
       #def name=(new_name)
       #  @name = new_name
       #end
       #...
     end
    好一個完整的類就寫好了。。。
    這樣new一個對象 song = Song.new("The Mass","abc",260)
    song.name #通路屬性,getter()
    song.name = "My Love" #修改屬性值,setter()

    (4)ruby中的虛拟屬性
    現在我們要将秒為機關的時間,換成分鐘
    def duration_in_minutes
       @duration/60.0
    end
    def duration_in_minutest=(new_duration)
      @duration = (new_duration*60).to_i
    end
    song = Song.new("a","b",260);
    song.duration_in_minutes --> 4.333
    song.duration_in_minutes = 4.2
    song.duration --> 252
    
    duration_in_minutes并不是執行個體變量
    對外界而言,她和其他屬性是一樣,
    在内并沒有對應的執行個體變量。
  (5)熟悉幾個概念
  屬性、執行個體變量和方法
  song.name #傳回執行個體變量的值
  song.duration_in_minutes  #傳回計算後的結果
  song.duration_in_minutes = 3.8
  #等号結尾的方法
 
  (6)類變量
  @@play
    class Song
    @@play=0
    def initialize(name,artist,duration)
      @name = name
      @artist = artist
      @duration = duration
      @play = 0
     end
     def play
       @play = @play + 1
       @@play =@@play + 1
       "this song #@play plays. Total #@@play palys."
       #xx 播放xx次,總共播放xx次。
     end
    end
    類變量是屬于類的。
    執行個體變量是屬于每一個對象的。
    (java中有靜态變量,靜态方法,靜态類都是屬于類的,通過類名直接調用)
    (執行個體變量有點像一般的java中的一般變量)
    (7)類方法
    有點象java中的靜态方法,類名直接調用
    當我們的歌曲時間太長了,可以給類定義一個方法
    class SongList
      MAX_TIME = 5*60
      def SongList.is_too_long(song)
        return song.duration > MAX_TIME
      end
    end
    我們會發現類方法遍布于ruby庫中,例如
    File類的對象用來表示在底層檔案系統中打開的一個檔案。File類提供了幾個類方法來操作檔案,而他們并未打開檔案,是以也沒有相應的File對象,如果你想要删除一個檔案,你可以調用類方法File.delete,傳入檔案名作為參數。
    File.delete("test.txt")
    (8)單例和其他的構造函數
      需求:記錄點唱機發生的所有事情:
          播放的歌曲,收到的點歌費,
          傾倒進去的各種奇怪液體等等
      因為我們期望為音樂保留網絡寬帶,
      是以我們将日志檔案儲存在本地。
      日志類,但是隻有一個,單例模式
      class MyLogger
        private_class_method :new
        @@logger = nil
        def MyLogger.create
            @@logger = new unless @@logger
            @@logger
        end
        傳回的對象都是一個,可以通過檢視方法的傳回對象的辨別來檢驗
        MyLogger.create.object_id --> 24031056
      end
      
      可以添加類方法對類進行擴充功能