跳轉至內容

Ruby 程式設計/概述

來自 Wikibooks,開放世界的開放書籍

| 安裝 Ruby →


Ruby 是一種最初由松本行弘(也稱為 Matz)開發的面向物件指令碼語言。Ruby 程式語言的主網站是ruby-lang.org。開發始於1993年2月,Ruby 的第一個 alpha 版本於1994年12月釋出。它被開發為PerlPython等指令碼語言的替代方案。[1] Ruby 大量借鑑了 Perl,並且類庫本質上是 Perl 功能的面向物件重組。Ruby 還借鑑了LispSmalltalk。雖然 Ruby 沒有借鑑 Python 的許多特性,但閱讀 Python 的程式碼幫助 Matz 開發了 Ruby。[1]

MacOS 已經預裝了 Ruby。大多數Linux發行版要麼預裝了 Ruby,要麼允許您輕鬆地從發行版的自由軟體儲存庫中安裝 Ruby。您還可以在Windows上下載並安裝 Ruby。技術能力更強的使用者可以下載 Ruby 原始碼[2],並將其編譯到大多數作業系統,包括UnixDOSBeOSOS/2、Windows 和 Linux。[3]

Ruby 結合了 Perl、Smalltalk、EiffelAda、Lisp 和 Python 的特性。[3]

面向物件

[編輯 | 編輯原始碼]

Ruby 竭盡全力成為一種純粹的面嚮物件語言。Ruby 中的每個值都是一個物件,即使是最原始的東西:字串、數字,甚至truefalse。每個物件都有一個,每個類都有一個超類。在類層次結構的根部是類BasicObject,所有其他類(包括Object)都繼承自它。

每個類都有一組方法,這些方法可以在該類的物件上呼叫。方法總是對物件進行呼叫——沒有“類方法”,就像許多其他語言中那樣(儘管 Ruby 在模擬它們方面做得很好)。[需要引用來源]

每個物件都有一組例項變數,用於儲存物件的狀態。例項變數是在物件上呼叫的方法內部建立和訪問的。例項變數對物件完全私有。其他任何物件都無法看到它們,即使是同一類的其他物件或類本身也無法看到。Ruby 物件之間所有通訊都透過方法進行。

除了類之外,Ruby 還有模組。模組具有方法,就像類一樣,但它沒有例項。相反,模組可以被包含或“混合”到類中,這會將該模組的方法新增到類中。這非常類似於繼承,但更靈活,因為一個類可以包含許多不同的模組。透過將各個功能構建到單獨的模組中,可以以複雜的方式組合功能並輕鬆重用程式碼。Mixin 有助於使 Ruby 程式碼免於複雜且限制性的類層次結構。

Ruby 是一種非常動態的程式語言。Ruby 程式不會像 C 或 Java 程式那樣進行編譯。程式中所有類、模組和方法的定義都在執行時由程式碼構建。程式還可以修改其自身的定義,即使在執行時。甚至像 String 和 Integer 這樣的語言中最原始的類也可以被開啟和擴充套件。Ruby 開發人員稱之為猴子補丁,這是大多數其他語言中無法做到的。

Ruby 中的變數是動態型別的,這意味著任何變數都可以儲存任何型別的物件。當您對物件呼叫方法時,Ruby 僅根據名稱查詢方法——它不關心物件的型別。這稱為鴨子型別,它允許您建立可以假裝成其他類的類,只需實現相同的方法即可。

單例類

[編輯 | 編輯原始碼]

當我說每個 Ruby 物件都有一個類時,我撒了謊。事實是,每個物件都有兩個類:“常規”類和單例類。物件的單例類是一個無名類,其唯一的例項是該物件。每個物件都有其自己的單例類,並在建立物件的同時自動建立。單例類繼承自其物件的常規類,並且最初為空,但您可以開啟它們並向其中新增方法,然後可以在屬於它們的單個物件上呼叫這些方法。這是 Ruby 避免“類方法”並保持其型別系統簡單優雅的秘密技巧。

超程式設計

[編輯 | 編輯原始碼]

Ruby 是如此面向物件,以至於類、模組和方法本身也是物件!每個類都是類Class的例項,每個模組都是類Module的例項。您可以在執行程式時呼叫其方法來了解它們,甚至修改它們。這意味著您可以使用 Ruby 程式碼生成類和模組,這種技術稱為超程式設計。明智地使用超程式設計允許您在程式碼中捕獲高度抽象的設計模式,並像呼叫方法一樣輕鬆地實現它們。

靈活性

[編輯 | 編輯原始碼]

在 Ruby 中,一切都是可變的。可以向現有類新增方法,無需子類化;可以對運算子進行過載;甚至可以在執行時重新定義標準庫的行為。

變數和作用域

[編輯 | 編輯原始碼]

在 Ruby 中,您不需要宣告變數或變數作用域。變數的名稱自動決定其作用域。

  • x是區域性變數(或變數以外的其他東西)。
  • $x是全域性變數。
  • @x是例項變數。
  • @@x是類變數。

程式碼塊

[編輯 | 編輯原始碼]

程式碼塊是 Ruby 最獨特、最受喜愛的特性之一。程式碼塊是一段程式碼,可以出現在方法呼叫之後,如下所示

laundry_list.sort do |a,b|
  a.color <=> b.color
end

程式碼塊位於doend之間。程式碼塊中的程式碼不會立即執行,而是打包成一個物件並作為引數傳遞給sort方法。該物件可以隨時呼叫,就像呼叫方法一樣。該sort方法在需要比較列表中的兩個值時都會呼叫程式碼塊。程式碼塊使您可以很好地控制sort的行為。程式碼塊物件(與任何其他物件一樣)可以儲存在變數中、傳遞給其他方法,甚至可以複製。

許多程式語言都支援這樣的程式碼物件。它們被稱為閉包,是任何語言中都非常強大的特性,但通常未被充分利用,因為建立它們的程式碼往往看起來很醜陋且不自然。Ruby 程式碼塊只是建立閉包並將其傳遞給方法的常見情況的一種特殊且簡潔的語法。這一簡單的特性啟發了 Ruby 開發人員廣泛使用閉包,並以各種創造性的新方式使用它們。

高階特性

[編輯 | 編輯原始碼]

Ruby 包含許多高階特性。

  • 異常 用於錯誤處理。
  • 標記清除垃圾回收器,而不是引用計數
  • 與作業系統無關的執行緒,允許您即使在 DOS 等作業系統上也能編寫多執行緒應用程式。(此特性將在 1.9中消失,它將使用本機執行緒)

您還可以使用C編寫 Ruby 擴充套件,或將 Ruby 嵌入到其他軟體中。

參考文獻

[編輯 | 編輯原始碼]
  1. a b Bruce Stewart (2001年11月29日). "Ruby 建立者訪談". O'Reilly. 檢索日期2006-09-11.
  2. "下載 Ruby". 檢索日期2006-09-11.
  3. a b "關於 Ruby". 檢索日期2006-09-11.
華夏公益教科書