想知道 Ruby 為什么會如此受歡迎嗎?為什么使用過它的支持者都稱贊它為巧妙、優(yōu)雅且易用更實用有趣的語言?
Ruby 發(fā)明者的理想
Ruby 是一個注重均衡的語言,它的發(fā)明者松本行弘 Yukihiro “matz” Matsumoto,混合了他喜歡的語言(Perl、 Smalltalk、 Eiffel、 Ada 和 Lisp ) 產(chǎn)生了一種具有函數(shù)式及指令程序設(shè)計特性的新語言。
他常說,他是“試著讓 Ruby 更自然,而不是簡單,就像生活一樣”。
除此之外,他還提到:
Ruby 就像人的身體一樣,表面上看來簡單,但是內(nèi)部卻相當(dāng)?shù)膹?fù)雜[1]。
Ruby 的成長
在 1993 年,沒有人會相信一個由日本業(yè)余語言設(shè)計者創(chuàng)建的面向?qū)ο蟮恼Z言,能最終在世界范圍內(nèi)被廣泛使用并且變得幾乎像 Perl 那樣流行。自從 1995 年 Ruby 公開發(fā)表以來,Ruby 在全球吸引了許多忠實的程序設(shè)計員。在 2006 年,Ruby 被廣泛接受。在各大城市都有活躍的使用者并通過社區(qū)舉辦許許多多場場爆滿的研討會。
在 Ruby-Talk,主要的 郵件列表 上,討論 Ruby 語言的文章爬升到每日 200 封。
在 TIOBE, 最流行的開發(fā)語言排名調(diào)查中, Ruby 排名為全球第 11 位。 根據(jù)這樣的成長情況,他們預(yù)測“在半年之中 Ruby 將會進入最受歡迎開發(fā)語言的前 10 名。”有越來越多受歡迎的軟件如 Ruby on Rails web framework2 是使用 Ruby 撰寫而成,也是造成 Ruby 如此快速成長的原因。
Ruby 是開源軟件。 不只是免費,而且可以自由的使用、復(fù)制、修改與發(fā)布。
所見到的都是對象
最初,Matz 從其它語言中找尋理想的語法,在網(wǎng)絡(luò)上他做了一段時間的調(diào)查,找到候選如“Perl“和“Python“。但都不是他想要的,他需要一個比 Perl 更強大、比 Python 更面向?qū)ο蟮恼Z言[3]。
在 Ruby 中,所有的東西都是對象,所有的信息和代碼都可以給它們所擁有的屬性和行為。面向?qū)ο蟪绦蛟O(shè)計中稱屬性為實例變量(instance variables),稱命令為方法 (methods)。 從下列程序代碼中看到 Ruby 能夠給數(shù)字賦于行為,從這點可以證明 Ruby 是純面向?qū)ο蟮恼Z言。
5.times { print "We *love* Ruby -- it's outrageous!" }
在許多語言中,數(shù)字和其它原生的類型都不是對象。而 Ruby 受 Smalltalk 語言影響,讓所有的類型都可以賦予方法及產(chǎn)生實例變量,并讓這些規(guī)則適用于 Ruby 所有對象。
Ruby 的靈活性
Ruby 是一個相當(dāng)靈活的語言,她允許用戶去改變她本身。 Ruby 的核心部分可以被更改或重新定義,模塊可以被添加。Ruby 試著不去妨礙程序員。
比如(+
) 是用做加法的運算符。如果你更喜歡使用易讀的 plus
的話,你可以給 Ruby 的內(nèi)建 Numeric
類添加一個函數(shù)。
class Numeric
def plus(x)
self.+(x)
end
end
y = 5.plus 6
# y is now equal to 11
Ruby 的符號只是語法的甜頭 (syntactic sugar)。你可以隨時重定義他們。
Blocks,一個獨特且強大的特性
Ruby 的代碼塊是非常強大的。程序員可以給任何函數(shù)添加一個密封 (closure) 來表述這個函數(shù)該如何工作。密封也被叫做代碼塊,是用過其他比如 PHP, Visual Basic 等規(guī)則語言的 Ruby 的初學(xué)者最喜歡使用的一個功能。
代碼塊取自函數(shù)語言。Matz 說:“我希望在 Ruby 的密封中融入 Lisp 的文化 [4]。”
search_engines =
%w[Google Yahoo MSN].map do |engine|
"http://www." + engine.downcase + ".com"
end
在上面的代碼中,代碼塊是在 do ... end
中的結(jié)構(gòu)。 map
函數(shù)將代碼塊應(yīng)用到一個詞的列表中。Ruby 的其他函數(shù)經(jīng)常會為程序員留出一個空當(dāng)給代碼塊來控制函數(shù)的功能。
Ruby 與 Mixin
于其他面向?qū)ο笳Z言不同,Ruby “有意”只提供單繼承。不過 Ruby 擁有模塊(在 Objective-C 里面叫做類別)。模塊是把許多方法放在了一個類別里。
類可以混合一個模塊,得到這個模塊提供的所有方法。比如所有提供 each
方法的類可以混合 Enumerable
模塊,來得到這個模塊提供的所有方法,當(dāng)然這些方法都會調(diào)用 each
做循環(huán)。
class MyArray
include Enumerable
end
一般來說,Ruby 愛好者相對于復(fù)雜和限制頗多的多態(tài)繼承方法來講更偏向于這種混合方法。
Ruby 的面貌
盡管 Ruby 只用很少的符號并且偏向與英文單詞做關(guān)鍵字,但是少量的符號也被用來裝飾 Ruby。Ruby 不需要提前定義變量。它用簡單的命名法來提示變量存在的范圍。
var
可以是局部變量。@var
是一個實例變量。$var
是一個全局變量。
這些信號讓程序員更清楚的看到每一個變量的角色,增強了程序的可讀性,也不需要在實例變量前面加上 self.
了。
更上一層樓
Ruby 還有其他豐富的特性:
- Ruby 有類似于 Java 和 Python 的異常處理,使處理錯誤更方便。
- Ruby 有一個真正的表示-清掃(mark-and-sweep)垃圾手機器來出來所有的 Ruby 對象。不需要在庫里維護引用數(shù)了。就像 Matz 說的:“這對您健康有意。”
- 為 Ruby 寫 C 的擴展比 Perl 和 Python 更容易。Ruby 有一個非常雅致的 API 從 C 語言調(diào)用 Ruby。這包括把 Ruby 作為嵌入式腳本語言時,從其他軟件里調(diào)用 Ruby。SWIG 界面也是可選的。
- Ruby 可以在操作系統(tǒng)允許的情況下動態(tài)調(diào)用庫。
- Ruby 提供不依賴操作系統(tǒng)的線程。所以在所有 Ruby 支持的操作系統(tǒng)里都可以使用多線程處理,不管操作系統(tǒng)支不支持,比如 MS-DOS!
- Ruby 極為輕便:它只要是在 GNU/Linux 上開發(fā)的,但也在很多類型的 UNIX 上運行,也支持 Mac OS X, Windows 95/98/Me/NT/2000/XP,DOS,BeOS,OS/2 等。
參考資料
1 Matz, 在 Ruby-Talk 郵件列表, 5月12日, 2000.
2 查看更多信息在 Ruby on Rails 主頁.
3 Matz, 在 Ruby 創(chuàng)造者的采訪, 11月29日, 2001.
4 Matz, 在 Ruby 的代碼塊和閉合, 12月22日, 2003.