在Ruby中,一切都是對象。對於那些喜歡使用高度物件導向的語言(例如Smalltalk,Eiffel或CLOS)的使用者來說,這是非常受歡迎的。例如1,2,3或10.8等等都是對象,而不是如Java或C++中的原始類型;字串是對象,類和方法也都是對象。例如,下面都是有效Ruby代碼(在Ruby中,注釋行是以"#"符號界定的):
#對象-34的絕對值 -34.abs #對一個浮點數進行四捨五入處理 10.8.round #返回一個字串對象的大寫且逆轉的副本 "This is Ruby".upcase.reverse #返回數學sin方法的參數個數 Math.method(:sin).arity |
圖5.Ruby是全對象化的:在Ruby中,整數,浮點數,字串,甚至類和方法都是對象。這裡的代碼展示了針對這些類型對象的方法調用。
在Ruby中,所有功能都是通過調用對象上的方法(或操作)實現的。事實上,Ruby中的方法調用就象其它程式語言中的函數或程序呼叫一樣。
就象在所有物件導向程式語言中一樣,對象是從類中建立的。Ruby庫中提供了許多預構建的類。你可以修改這些類或構建你自己的類。Ruby中的類是使用"class"關鍵字定義的。類名開始是一個大寫字母。類定義以"end"關鍵字結束。因此,一個Rectangle類的定義可能有如下形式:
為了把方法添加到類,可以使用def關鍵字。方法的定義也應該以end關鍵字結束。跟隨def關鍵字和方法名後面就是方法參數。把一個area方法添加到上面的Rectangle類的代碼看上去如下所示:
class Rectangle def area (hgt,wdth) return hgt*wdth end end |
對於那些熟悉其它程式語言的使用者,他可能注意到一些差別。Ruby並不使用任何花括弧來限定類或方法,也不使用分號或其它字元來表示程式語句行的結束。Ruby的目標,根據它的建立者說明,是簡單、易用並使編碼成為一件"趣事"。誰想記住所有的那些分號?沒有意思!在Ruby中,只要你把語句放在一行上,不需要分號或其它程式碼結束標記。順便說一下,在area方法參數周圍的括弧是不必要的。在預設情況下,Ruby返回一個方法中最後的內容,因此return關鍵字也可以省略。因此,你可以建立如下簡單編碼的Rectangle類:
class Rectangle def area hgt, wdth hgt*wdth end end |
儘管上面代碼是有效,但是小括弧還是被推薦使用於方法參數表達的,這主要是為了實現較好的可讀性。
執行個體變數和屬性
類也可以有執行個體變數(在一些語言中也稱為屬性)。例如,由Rectangle類建立的對象應該都有一個高度和寬度。在Ruby中,執行個體變數不必顯式地在類中聲明,只是必須在它們的命名中以一個特殊字元來標記和使用。具體地說,所有的執行個體變數名都以"@"開頭。為了實現當調用area方法時,儲存矩形執行個體的高度和寬度,你僅需把執行個體變數添加到area方法即可:
class Rectangle def area (hgt, wdth) @height=hgt @width = wdth @height*@width end end |
更確切地說,當建立一個Rectangle執行個體時,應該指定高度和寬度,而執行個體變數在此時才確定。另外,Ruby提供了一種特殊的方法initialize,它允許你建立或準備類的新執行個體:
class Rectangle def initialize (hgt, wdth) @height = hgt @width = wdth end def area () @height*@width end end |