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
可以添加類方法對類進行擴充功能