Ruby 是一種面向物件、指令式、函式式、動態的通用程式語言。在 20 世紀 90 年代中期由日本電腦科學家松本行弘（Matz）設計並開發。 遵守 BSD 許可證和 Ruby License。它的靈感與特性來自於 Perl、Smalltalk、Eiffel、Ada 以及 Lisp 語言。由 Ruby 語言本身還發展出了 JRuby（Java 平臺）、IronRuby（NET 平臺）等其他平臺的 Ruby 語言替代品。 歷史 150px 縮圖 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 的全盛時期。 這一時期許多 GitHub 上有創意的專案以 Ruby 撰寫，並且有 GitHub 與 Twitter 等重要網頁選用 Ruby 編寫。 2010 年以後，Javascript 和 Python 這兩個和 Ruby 定位類似的語言在 Google 等公司與一些社群的支援下越來越受到歡迎。 其中，V8 引擎使得 Javascript 在同型別語言中有著突出的效能； NumPy 讓 Python 可以更加優雅的進行科學運算。 2009 年，以 V8 引擎製作的伺服端平臺 Nodejs 發表。 2015 年 機器學習知名專案 TensorFlow 發表，並選用 Python 作為官方 API 使用的語言。 Ruby 在多年被蠶食後走向衰微。 Ruby 現在仍為 TIOBE 程式語言流行排行前 20 名，但已經遠遠沒有全盛時期受歡迎。 在 Ruby 逐漸失寵以後，開發團隊開始有意的提升 Ruby 的效能。在 Ruby 2X 版本後期提出「Ruby 3x3」計畫，目標是希望 Ruby 30 版本能比 20 版本有 3 倍效能提升。 從 Ruby 30 開始，團隊開始嘗試在 Ruby 中加入 JIT 的功能。在 31 版本之後，Ruby 的團隊與 Shopify 團隊合作，嘗試性地加入新的 JIT 編譯器 YJIT。 並且 YJIT 在 Ruby 32 正式被引入。 Ruby 的理念 減少程式設計時候的不必要的瑣碎時間，令編寫程式的人高興，是設計 Ruby 語言的 Matz 的一個首要的考慮；其次是良好的介面設計。他強調系統設計必須強調人性化，而不是一味從機器的角度設想。 遵循著，Ruby 語言通常非常直觀，按照程式設計人認為它應該的方式執行。 Ruby 的作者認為 Ruby Smalltalk Perl 2，表示 Ruby 是一個語法像 Smalltalk 一樣完全面向物件、指令碼執行、又有 Perl 強大的文書處理功能的程式語言。 Ruby 的版本體系 Ruby 版本號的構成形式是（MAJOR）（MINOR）（TEENY），均為只有 1 位的整數；如 186、193。 19 版系統的 TEENY 不小於 1 時為穩定版，TEENY 為 0 的版本是開發版。在 19 之前的版本中偶數 MINOR 代表穩定版，奇數 MINOR 代表開發版。Ruby 語言入門東南大學出版社 2010 年 4 月第一版 P19 Ruby 的 Hello World 程式 下面是一個在標準輸出裝置上輸出 Hello World 的簡單程式： usrbinenv ruby puts Hello world 或者是在 irb 互動式命令列的模式下： puts Hello world Hello world nil Ruby 的特點 變數與函式的命名規則 乍看之下與 Perl 的命名規則有些類似，不過 Perl 的命名用來區分純量、陣列與對映；而 Ruby 的命名規則用來表示變數與類別的關係。Ruby 的變數有以下幾種： 一般小寫字母、底線開頭：zhtw 變數；zh 變數；zhcn 變數（Variable）。 開頭：zhtw 全域變數；zh 全域性變數；zhcn 全域性變數（Global variable）。 開頭：zhtw 例項變數；zh 例項變數；zhcn 例項變數（Instance variable）。 開頭：zhtw 類別變數；zh 類別變數；zhcn 類變數（Class variable）類別變數被共享在整個繼承鏈中 大寫字母開頭：常數（Constant）。 有些函式則會加一個字尾，用來表示函式的用法，跟變數命名規則不同，函式的命名規則只是習慣，不具強制性，即使你不照規則命名也不影響程式運作 結尾：賦值方法，相當於其他程式語言的 set 開頭的方法，算是一種語法糖。 結尾：破壞性方法，呼叫這個方法會修改本來的物件，這種方法通常有個非破壞性的版本，呼叫非破壞性的版本會回傳一個物件的副本。 結尾：表示這個函式的回傳值是個布林值。 多種字串表示法 Ruby 提供了多種字串的表示方法，方便撰寫有大量文字資料的程式。除了來自 C 語言的引號表示法之外，還有來自於 Perl 的百分號字面量記法，以及方便書寫大量內容的 Heredoc 記法。Ruby 可以方便地以 variable_name 的方式向字串中插入變數。 a n 這是一個單引號的字串，反斜線和變數插值不會被轉義 b q 這是一個不可轉義的字串 c n 這是一個雙引號的字串，反斜線和變數插值會被轉義 na d Q n 這是一個常量字串，特殊內容同樣會被轉義 n e BLOCK 這是一個以 Heredoc 方式書寫的常量字串，可轉義，結尾標誌不可縮排 BLOCK f BLOCK 這是一個可以縮排的 Heredoc 字串 BLOCK g BLOCK 這是一個可以縮排的 Heredoc 字串 縮排會被自動去掉，在 23 版本中引入 BLOCK h t 這是一個可轉義的的字串 n 動態修改物件、類別 Ruby 是動態語言，你可以在程式中修改先前定義過的類別。 也可以在某個類別的例項中定義該例項特有的方法，這叫做原型方法（prototype）。 class MyClass def the_method general method end end mc MyClassnew def mcthe_method special for this instance end mcthe_method 強大的反射機制與超程式設計 Ruby 的反射功能相當驚人，甚至可以自行追蹤程式運作，或是取出 private 變數、攔截方法的呼叫。 常常與『可以動態的修改物件』這項特色結合，做為『超程式設計』的功能：程式在執行時， 可以由程式設計師提供的資訊，自行生成、修改類別或物件，這項功能大大的提高了撰寫程式碼的效率。 在 Rails 之中，就大量使用了這種特性。 以下為用 Rails 使用超程式設計的範例： class Project ActiveRecordBase belongs_to portfolio has_one project_manager has_many milestones end 在這個例子中，Project 類別繼承 Base 類別，Base 類別內建的 belongs_to、has_one、has_many 方法，便會根據引數來修改 Project 類別的內容，並自行建立其他相關的方法。程式設計師可以更專心處理程式的運作，而不必為每個類別重複得撰寫程式碼。 豐富靈活的迴圈表示 使用 for，在 1 到 3 取出值 1、2、3 到 outer_i 裡操作。 for outer_i in 13 do puts for outer_i 100 end 在 1 到 3 的集合裡針對每個值，放到 i 裡操作。 13each do i puts each i 100 end 只要符合 outer_i 小於等於 300，則進入迴圈。 outer_i 100 while outer_i 300 puts while outer_i outer_i 100 end 直到 outer_i 大於 300 前，都可以進入迴圈。 outer_i 100 until outer_i 300 puts until outer_i outer_i 100 end 無限迴圈，用 break 來打斷迴圈。 outer_i 100 loop do break if outer_i 300 puts loop outer_i outer_i 100 end 作 3 次迴圈，i 從 0 開始遞增 1。 3times do i puts times i 1 100 end 從 1 遞增 1 到 3，值傳入 i 來操作。 1upto 3 do i puts upto i 100 end 從 3 遞減 1 到 1，值傳入 i 來操作。 3downto 1 do i puts downto 400 i 100 end 從 100 開始以每步 100 邁向 300。 100step 300 100 do i puts step i end 其他特色 完全物件導向：任何東西都是物件，沒有基礎型別 變數是動態型別。 任何東西都有值：不管是四則運算、邏輯表示式還是一個語句，都有回傳值。 運算子過載 垃圾回收 強型別 zh 變數無需宣告；zhtw 不必事先宣告變數；zhcn 變數無需宣告 在 Windows 上，載入 DLL 比較與批評 讓人意外之處 在 Ruby 中，只有 false 和 nil 表示 false，其它的所有值都表示 true（包括 0、00、、）To Ruby From Python ，When tested for truth only false and nil evaluate to a false value Everything else is true including 0 00 and 。這點和 C 語言的『用 0 代表 false』不同。 Ruby 的字串是可改變的，這與 Java 固定不變的字串不同。在 Ruby 中，常用 Symbol 物件來表示不可變的字串。Ruby 23 提供了預設凍結字串的選項，在原始碼開頭新增魔術註釋 frozen_string_literal true 可以開啟這個選項，當用戶試圖更改 String 物件時會丟擲執行時異常。同時，松本行弘表示，在 Ruby 3 中，字串將是預設不可變的。 Ruby 的繼承功能相當脆弱，儘管 Ruby 是一個物件導向語言，Ruby 內的許多規則，卻使得子類別有可能不小心就覆寫了父類別的功能，在《The Ruby Programming Language》一書中，建議除非程式設計師對一個類別相當瞭解，否則盡可能不要使用繼承。 和 Perl 6 比較 CPAN 上排名第一名，同時也是 Perl 6 的開發者的唐鳳（Autrijus Audrey）說：「Ruby 就是『沒有到處打廣告的 Perl 6』」。Perl 6 於 2019 年 10 月更名為 Raku。 松本行弘在接受歐萊禮（OReilly）訪問時，提到「Ruby 借用了很多 Perl 的東西，Python 遠比 Perl 要少」、「我認為 Ruby 這個名字作為 Perl 之後的一門語言的名字真是再恰當不過了。」 Perl 之父拉里沃爾（Larry Wall）說：「很多方面上我還是很喜歡 Ruby 的，這是因為那些部分是從 Perl 借過去的。：）」、「我還喜歡 Ruby 的 C 一元星號運算子，所以我把它加到 Perl 6 裡面。」 程式範例 下面的程式碼可以在 Ruby shell 中執行，比如 irb 互動式命令列，或者儲存為檔案並執行命令 ruby filename。 一些基本的 Ruby 程式碼： Everything including a literal is an object so this works 199abs 199 ruby is coollength 12 Rick Astleyindex c 2 Never gonna let you downsub let you down give you up Never gonna give you up Nice Day Isnt Itdowncasesplit sortuniqjoin acdeinsty 一些轉換： puts Whats your favorite number number getschomp outputnumber numberto_i 1 puts outputnumberto_s is a bigger and better favorite number 集合 構造和使用陣列： a 1hi 314 1 2 4 5 p a 2 314 p a2 314 p areverse 4 5 2 1 314 hi 1 p aflattenuniq 1 hi 314 2 4 5 構造和使用關聯陣列： hash water wet fire hot puts hash fire Prints hot hasheach_pair do key value Or hasheach do key value puts key is value end Prints water is wet fire is hot hashdelete water Deletes water wet hashdelete_if kvalue valuehot Deletes fire hot zhhans 塊；zhhant 區塊 和迭代器 有兩個語法用於建立 zhhans 塊；zhhant 區塊： puts Hello World Note the braces or do puts Hello World end 傳引數的 zhhans 塊；zhhant 區塊 使用閉包 Closure： In an object instance variable denoted with remember a block def remember a_block block a_block end Invoke the above method giving it a block which takes a name remember name puts Hello name When the time is right for the object call the closure blockcall Jon Hello Jon 從方法中返回閉包： def create_set_and_get initial_value0 Note the default value of 0 closure_value initial_value return Procnew x closure_value x Procnew puts closure_value end setter getter create_set_and_get ie returns two values settercall 21 gettercall 21 迭代呼叫呼叫時提供的 zhhans 塊；zhhant 區塊： def use_hello yield hello end Invoke the above method passing it a block use_hello string puts string hello 使用 zhhans 塊；zhhant 區塊 迭代陣列： array 1 hi 314 arrayeach item puts item 1 hi 314 arrayeach_index index puts index array index 0 1 1 hi 2 314 36each num puts num 3 4 5 6 像 inject 方法可以接收一個引數和一個 zhhans 塊；zhhant 區塊。迭代的注入列表的每一個成員，執行函式時儲存總和。這同函式程式語言中的 foldl 函式相類似，比如： 135inject 10 sum element sum element 19 首先 zhhans 塊；zhhant 區塊 接收到了 10（inject 的引數）當作變數 sum，並且 1（陣列的第一個元素）當作變數 element；這會返回 11。11 又被當作下一步的 sum 變數，它加上 3 得到了 14。14 又被加上了 5，最終返回結果 19。 zhhans 塊；zhhant 區塊 執行在內建的方法中： Fileopen filetxt w do file w denotes write mode fileputs Wrote some text end File is automatically closed here Filereadlines filetxteach do line puts line end Wrote some text 使用列舉器和塊求 1 到 10 的平方： 110collect x xx 1 4 9 16 25 36 49 64 81 100 zhhans 類；zhhant 類別 下面的程式碼定義一個命名為 Person 的 zhhans 類；zhhant 類別。含有一個「initialize」方法，用於構選建立一個新物件，它還有兩個方法，一個過載了 比較運算子（這樣 Arraysort 可以使用 age 排序）另一個過載了 to_s 方法（這樣 Kernelputs 可以格式化輸出），attr_reader 是 Ruby 中元資料程式設計的例子：attr_accessor 為例項變數定義了 getter 和 setter 方法，attr_reader 只是一個 getter 方法。另外，方法中最後的宣告是它的返回值，也允許顯式的使用「return」語句。 class Person attr_reader name age def initialize name age name age name age end def person Comparison operator for sorting age personage end def to_s name age end end group Personnew Bob 33 Personnew Chris 16 Personnew Ash 23 puts groupsortreverse 下面按 age 倒序輸出了三個名字： Bob 33 Ash 23 Chris 16 各種版本 Matzs Ruby interpreter，最初也是最常見的 Ruby 版本，簡稱 MRI，用 C 語言撰寫。 JRuby，類似 Python 的 Jython，一個可於 Java 上執行 Ruby 的語言，支援 Java 的介面和類別。最新發布版為 9160（20161109），與 Ruby 23 相容。它的官方網站為 jrubyorg。 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 中 Category 程式設計語言 Category 指令碼語言 Category 面向文字程式語言 Category 面向物件的程式語言 Category 基於類的程式語言 CategoryISO 標準化程式語言 Category1995 年建立的程式語言 Category 日本發明 Category 自由編譯器與直譯器