Ruby

**Ruby** 是一種物件導向、指令式、函數式、動態的通用程式語言。在 20 世紀 90 年代中期由日本電腦科學家松本行弘（Matz）設計並開發。

遵守 BSD 授權條款和 Ruby License。它的靈感與特性來自於 Perl、Smalltalk、Eiffel、Ada 以及 Lisp 語言。由 Ruby 語言本身還發展出了 JRuby（Java 平台）、IronRuby（.NET 平台）等其他平台的 Ruby 語言替代品。

## 歷史

Ruby 的作者－－松本行弘於 1993 年 2 月 24 日開始編寫 Ruby，直至 1995 年 12 月才正式公開發佈於 fj（新聞群組）。之所以稱為 Ruby 是取法自 Perl，因為 Perl 的發音與 6 月的誕生石 pearl（珍珠）相同，Ruby 選擇以 7 月的誕生石 ruby（紅寶石）命名。

Ruby 相較之下比其他類似的程式語言（如 Perl 或 Python）年輕，又因為 Ruby 是日本人發明的，所以早期的非日文資料和程式都比較貧乏，在網上仍然可以找到早期對 Ruby 的資料太少之類的批評。約於 2000 年，Ruby 開始進入美國，英文的資料開始發展。

2004 年，Rails 框架誕生，Ruby 更加廣為人知，Ruby 並於 2006 年為 TIOBE 獲選為年度程式語言。

## Ruby 的理念

減少編程時候的不必要的瑣碎時間，令編寫程式的人高興，是設計 Ruby 語言的 Matz 的一個首要的考慮；其次是良好的介面設計。他強調系統設計必須強調人性化，而不是一味從機器的角度設想。

遵循著最小驚訝原則，Ruby 語言通常非常直觀，按照編程人認為它應該的方式執行。

Ruby 的作者認為 **Ruby > (Smalltalk + Perl) / 2**，表示 Ruby 是一個語法像 Smalltalk 一樣完全物件導向、指令碼執行、又有 Perl 強大的文字處理功能的程式語言。

## Ruby 的版本體系

Ruby 版本號的構成形式是（MAJOR）.（MINOR）.（TEENY），均為只有 1 位的整數；如「1.8.6」、「1.9.3」。

1.9 版系統的 TEENY 不小於 1 時為穩定版，TEENY 為 0 的版本是開發版。在 1.9 之前的版本中偶數 MINOR 代表穩定版，奇數 MINOR 代表開發版。

## Ruby 的 Hello World 程式

下面是一個在標準輸出裝置上輸出 Hello World 的簡單程式：

或者是在 irb 互動式命令列的模式下：

## Ruby 的特點

### 變數與函式的命名規則

乍看之下與 Perl 的命名規則有些類似，不過 Perl 的命名用來區分純量、陣列與對映；而 Ruby 的命名規則用來表示變數與類別的關係。Ruby 的變數有以下幾種：

* 一般小寫字母、底線開頭：變數（Variable）。
* `$` 開頭：全域變數（Global variable）。
* `@` 開頭：實例變數（Instance variable）。
* `@@` 開頭：類別變數（Class variable）類別變數被共享在整個繼承鏈中
* 大寫字母開頭：常數（Constant）。

有些函式則會加一個後綴，用來表示函式的用法，跟變數命名規則不同，函式的命名規則只是習慣，不具強制性，即使你不照規則命名也不影響程式運作

* `=` 結尾：賦值方法，相當於其他程式語言的 `set` 開頭的方法，算是一種語法糖。
* `!` 結尾：破壞性方法，呼叫這個方法會修改本來的物件，這種方法通常有個非破壞性的版本，呼叫非破壞性的版本會回傳一個物件的副本。
* `?` 結尾：表示這個函式的回傳值是個布林值。

### 多種字串表示法

Ruby 提供了多種字串的表示方法，方便撰寫有大量文字資料的程式。除了來自 C 語言的引號表示法之外，還有來自於 Perl 的百分號字面量記法，以及方便書寫大量內容的 Heredoc 記法。Ruby 可以方便地以 `#{variable_name}` 的方式向字串中插入變數。

### 動態修改物件、類別

Ruby 是動態語言，你可以在程式中修改先前定義過的類別。
也可以在某個類別的實例中定義該實例特有的方法，這叫做原型方法（prototype）。

### 強大的反射機制與元程式設計

Ruby 的反射功能相當驚人，甚至可以自行追蹤程式運作，或是取出 private 變數、攔截方法的呼叫。
常常與『可以動態的修改物件』這項特色結合，做為『元程式設計』的功能：程式在運行時，
可以由程式設計師提供的資訊，自行生成、修改類別或物件，這項功能大大的提高了撰寫程式碼的效率。
在 Rails 之中，就大量使用了這種特性。

以下為用 Rails 使用元程式設計的範例：

在這個例子中，`Project` 類別繼承 `Base` 類別，`Base` 類別內建的 `belongs_to`、`has_one`、`has_many` 方法，便會根據參數來修改 Project 類別的內容，並自行建立其他相關的方法。程式設計師可以更專心處理程式的運作，而不必為每個類別重複得撰寫程式碼。

### 豐富靈活的迴圈表示

### 其他特色

* 完全物件導向：任何東西都是物件，沒有基礎型別
* 變數是動態類型。
* 任何東西都有值：不管是四則運算、邏輯表達式還是一個語句，都有回傳值。
* 運算子多載
* 垃圾回收
* 強型別
* 不必事先宣告變數
* 在 Windows 上，載入 DLL

## 比較與批評

### 讓人意外之處

* 在 Ruby 中，只有 `false` 和 `nil` 表示 false，其它的所有值都表示 true（包括 `0`、`0.0`、`""`、`[]`）。這點和 C 語言的『用 `0` 代表 `false`』不同。
* Ruby 的字串是可改變的，這與 Java 固定不變的字串不同。在 Ruby 中，常用 `Symbol` 物件來表示不可變的字串。Ruby 2.3 提供了預設凍結字串的選項，在原始碼開頭添加魔術注釋 `# frozen_string_literal: true` 可以打開這個選項，當使用者試圖更改 `String` 物件時會丟擲執行時異常。同時，松本行弘表示，在 Ruby 3 中，字串將是預設不可變的。
* Ruby 的繼承功能相當脆弱，儘管 Ruby 是一個物件導向語言，Ruby 內的許多規則，卻使得子類別有可能不小心就覆寫了父類別的功能，在《The Ruby Programming Language》一書中，建議除非程式設計師對一個類別相當了解，否則盡可能不要使用繼承。

### 和 Perl 6 比較

* CPAN 上排名第一名，同時也是 Perl 6 的開發者的唐鳳（Autrijus / Audrey）說：「Ruby 就是『沒有到處打廣告的 Perl 6』」。
* 松本行弘在接受歐萊禮（O'Reilly）訪問時，提到「Ruby 借用了很多 Perl 的東西……，Python 遠比 Perl 要少……」、「我認為 Ruby 這個名字作為 Perl 之後的一門語言的名字真是再恰當不過了。」
* Perl 之父拉里・沃爾（Larry Wall）說：「很多方面上我還是很喜歡 Ruby 的，這是因為那些部分是從 Perl 借過去的。：-）」、「我還喜歡 Ruby 的 C<\*> 一元星號運算子，所以我把它加到 Perl 6 裡面。」

## 程式範例

下面的代碼可以在 Ruby shell 中執行，比如 irb 互動式命令列，或者儲存為檔案並執行命令 `ruby <filename>`。

* 一些基本的 Ruby 代碼：

* 一些轉換：

### 集合

* 構造和使用陣列：

* 構造和使用關聯陣列：

### 區塊和迭代器

* 有兩個語法用於建立區塊：

* 傳參數的區塊使用閉包 Closure：

* 從方法中返回閉包：

* 迭代呼叫呼叫時提供的區塊：

* 使用區塊迭代陣列：

像 inject () 方法可以接收一個參數和一個區塊。迭代的注入列表的每一個成員，執行函式時儲存總和。這同函式程式語言中的 foldl 函式相類似，比如：

首先區塊接收到了 10（inject 的參數）當作變數 sum，並且 1（陣列的第一個元素）當作變數 element；這會返回 11。11 又被當作下一步的 sum 變數，它加上 3 得到了 14。14 又被加上了 5，最終返回結果 19。

* 區塊執行在內建的方法中：

* 使用列舉元和塊求 1 到 10 的平方：

### 類別

下面的代碼定義一個命名為 Person 的類別。含有一個「initialize」方法，用於構選建立一個新物件，它還有兩個方法，一個多載了 <=> 比較運算子（這樣 `Array#sort` 可以使用 age 排序）另一個多載了 `to_s` 方法（這樣 `Kernel#puts` 可以格式化輸出），`attr_reader` 是 Ruby 中元資料編程的例子：`attr_accessor` 為實例變數定義了 getter 和 setter 方法，`attr_reader` 只是一個 getter 方法。另外，方法中最後的聲明是它的返回值，也允許顯式的使用「return」語句。

* 下面按 age 倒序輸出了三個名字：

## 各種版本

Matz's Ruby interpreter, 最初也是最常見的 Ruby 版本，簡稱 MRI, 用 C 語言撰寫.

JRuby，類似 Python 的 Jython，一個可於 Java 上執行 Ruby 的語言，支援 Java 的介面和類別。最新發布版爲 9.1.6.0（2016-11-09），與 Ruby 2.3 相容。它的官方網站為 jruby.org。

mruby 是一個輕量級的 Ruby 直譯器，可以嵌入到其它應用程式中，或者作為庫連結到應用中。

## 參見

* Python（經常和 Ruby 比較）
* Perl
  * Perl 6（vs. Ruby）
* QtRuby：Qt 的 Ruby 綁定
* Smalltalk
* Ruby on Rails：一個 MVC 的快速網站開發應用框架。
* RGSS：使用 Ruby 為基礎的遊戲指令碼系統。

## 注釋

## 參考文獻

## 外部連結

* Ruby 的官方網站（頁面存檔備份，存於網際網路檔案館）
* 《Programming Ruby》網路版
* Ruby Application Archive
* RubyForge 提供一個類似 SourceForge 和 Freshmeat 的環境給用 Ruby 或給 Ruby 寫的工具，現已停止運營。
* Ruby Documentation project
* Full Ruby on Rails Tutorial
* TryRuby（頁面存檔備份，存於網際網路檔案館）（英文）
* Ruby Taiwan 社群 （頁面存檔備份，存於網際網路檔案館）
* Ruby 中國社群 （頁面存檔備份，存於網際網路檔案館）目前中國 Ruby 開發者公認的 Ruby 中文社群。
* 微服務架構在 Ruby 中（英文）