原始地址:http://bbs.lupaworld.com/htm_data/254/0609/21737.html
1.
它是面向對象的。這表示什么意義呢?如果問10個程序員,你也許會得到12種結果,你有你的看法,我不會試圖去改變你的看法。但是有一點,Ruby提供了
對數據和方法的封裝,允許類的繼承,對象的多態。不像其它語言(C++,Perl等),Ruby從設計的時候開始就是一種面向對象的語言。
2. 它是純面向對象的語言。難道是我多余?不是這樣的,之所以這么說,因為Ruby中一切都是對象,包括原始數據類型(primitive
data types),比如字符串,整型,都表示的是一個對象,而不需要Java那樣提供包裝類(wrapper
classes)。另外,甚至是常量,也會被當作對象來處理,所以一個方法的接收者,可以是一個數字常量。
3.
它是動態語言。對于只熟悉像C++,Java這樣靜態語言的人來說,這是一個重大的概念上的差別。動態意味著方法和變量可以在運行時候添加和重定義。它減
少了像C語言那樣的條件編譯(#ifdef),而且容易實現反射API(reflection
API)。動態性使得程序能自我感知(self-aware),比如運行時類型信息,檢測丟失的方法,用來檢測增加方法的鉤子等。在這些方面Ruby和
Lisp和Smalltalk都有一些關系。
4.
它是一種解釋執行的語言。這是一個負雜的問題,值得重點解釋一下,也許這個特點會因為性能的原因而引起從優點變為缺點的爭論。對于此,我有幾點見解:1.
第一:快速開發循環是一個巨大的好處,這要得意于Ruby的解釋執行。2.多慢才叫慢呢?在說它慢之前先定一個慢的基準。3.也許有人要批評我了,但我還
要說:處理器每年都在變得原來越快。4.如果你真的很在意你的速度,你可以用C開發一部分你的代碼。5.最后,從某種意義上說,這是一個還在爭論中的問
題,沒有一個語言天生就是解釋型的,世界上沒有哪個法律進制開發一個Ruby編譯器出來。
5.
它理解正則表達式。很多年之前,正則表達式只是用在UNIX的工具如grep或者sed中,或者在vi中進行一些一定的查找-替換等。Perl的出現解決
了這些問題,而現在,Ruby同樣也能做到這些。越來越多得人認識到了這種字符串和文本處理技術的難以置信的能力,如果你對此表示懷疑,那么請去看一下
Jeffrey Friedl的書Mastering Regular Expressions,然后,你就應該不會有什么懷疑了。
6. 它是多平臺的。 Ruby可以運行在Linux,UNIX,Windows,BeOS?,甚至MS-DOS。如果我沒記錯,甚至還有一個Amiga 版本的
7.
它是派生來的。這是一件好事情嗎?拋去書本上的知識,它是有用的。牛頓曾說過“我如果看得比別人遠,那是因為我站在巨人的肩膀上”。Ruby同樣也是站在
巨人的肩膀上,它借鑒了Smalltalk, CLU, Lisp, C, C++, Perl,
Kornshell等的優點。在我看來它的原則包括:1.不要重復制造輪子。2.不要修補沒有損壞的東西。3.最后一個也是比較特別的,它能平衡
(Leverage )你已有的知識。你了解UNIX的文件和管道,沒關系,你可以在Ruby中繼續用,你用了兩年的時間學習了printf
指示符,不必擔心,Ruby中你也可以使用printf。你知道Perl的正則表達式處理,那么你也就學會了Ruby中的正則表達式。
8.
它是創新的。是不是覺得這個和第七條矛盾了?也許是有一部分矛盾,每個硬幣都有兩面。一些Ruby的特點都是創新的東西,比如非常有用的Mix-in,也
許這個特點會被后來的語言借鑒。(注:一位讀者指出Lisp早在1979年就有mix-in了,這是我的疏忽;我應該找個更好的例子,并且能確信它。)
9. 它是非常高層次的語言。(Very High-Level Language :VHLL)
這是一個容易引起爭論的話題,因為這個術語還沒有廣泛使用。而且它的意思比起OOP來說還是有討論余地的。我這么說,指的是Ruby能支持復雜的結構和這
些結構的負雜的操作,而需要的指令非常少,這與最小努力原則(Principle of Least Effort)一致。
10. 它有一個靈巧的垃圾收集器。 像malloc和free 這樣的例程已經是昨天的惡夢了,你不需要什么回收內存的操作,甚至是調用垃圾收集器。
11. 它是腳本語言。 不要因為此就認為它不夠強大,它不是一個玩具。它是完全成熟的語言,用它能輕松的完成傳統的腳本操作,比如運行外部程序,檢查系統資源,使用管道,捕獲輸出等等。
12. 它是通用的。 Kornshell做的東西它也可以做,C語言做的東西它也可以做的很好。你可以用它寫一個只運行一次的只有10行的程序,或者對一些遺留程序進行包裝,你想寫個web server,或者一個CGI,都可以用Ruby來寫。
13. 它是多線程的。 Y你可以用一些簡單的API來寫多線程程序,甚至在MS-DOS上都可以。
14. 它是open source的。 你想看它的源代碼嗎?可以,你也可以提交補丁,參加廣泛的社區,包括它的創造者。
15. 它是值覺得。 Ruby的學習曲線比較低,而如果你翻過了一個坎,你開始“猜測”事情是怎么工作的,而且你的猜測很多時候都是正確的。Ruby堅持最小驚訝( Least Astonishment)的原則。
16. 它有異常機制。 像Java和 C++一樣, Ruby 中也有異常機制,這意味著你不必因為返回值而將代碼弄得凌亂不堪,很少的嵌套if語句,很少的意大利面條似的邏輯,更好的錯誤處理。
17. 它有一個高級的數組類:Array。
Ruby中數組都是動態的,你不必像pascal那樣在聲明它的大小,也不必像C,C++那樣為它分配內存。它們是對象,所以你不必關心它們的長度,實際
上你不能"走到末尾(walk off the
end)"。這個類提供了各種方法,使得你能夠根據索引,根據元素來訪問數組內容,也可以反向處理數組。你也可以用數作作為set,隊列,堆棧等。如果你
想用查找表,可以用哈希結構。
18. 它是可以擴展的。 你可以用C或者Ruby來編寫外部庫(external libraries),同樣,你也可以修改已有的類和對象。
19. 鼓勵文檔編程(literate programming)。 你可以在Ruby程序中嵌入注釋或者文檔,這些文檔可以用Ruby的文檔工具提取和處理。(真正的文檔編程者可能認為這是必須的基本東西吧)
20.
創造性的使用標點符號和大寫字母。比如一個方法返回一個boolean型(Ruby中并沒有這種說法),那么一般這個方法最后都以問號結尾,如果一個方法
要修改接收者本身,或者具有破壞性,則用一個感嘆號結尾,簡單,直覺。所有常量,包括類名,都以大寫字母開頭,所有對象屬性以@符號開頭。這有匈牙利命名
法的實用性,但是沒有視覺上的丑陋性。
21. Reserved words aren't.It's perfectly
allowable to use an identifier that is a so-called "reserved word" as
long as the parser doesn't perceive an amibiguity. This is a breath of
fresh air.
22. 支持迭代器。 這使得你可以給一個數組,list,tree等對象傳遞一個塊,然后對它們的每個元素進行block調用。這個技術值得深入學習。
23. 它的安全性。 Ruby借鑒了Perl中基于$SAFE變量的分層控制機制 。這對于CGI程序來說非常有用,可以防止人們攻擊web服務器。
24. Ruby中沒有指針。 像
Java一樣,和C++不同,Ruby中沒有指針的概念,所以免除了關于指針語法和調試的頭疼。當然,這也意味著最底層的程序開發將會很困難,比如訪問一
個設備的控制狀態寄存器;但是,我們可以用一個C庫來調用。(像C語言程序員有時候要使用匯編語言一樣,Ruby程序員有時候也要使用C語言來完成一定的
任務)
25. 它使得人們專注于細節。
Ruby中有很多同義詞和別名,你也許不記得字符串或數組的長度是size還是length,沒關系,它們任何一個都可以工作。對于Range來說,你可
以使用begin 和end 或者使用 first 和
last,它們也都工作。你想拼寫indices,結果寫成了indexes,沒關系,這兩個都一樣。
26. 非常靈活的語法。 方法調用時候括號可以省略,參數之間只需用逗號分割。類似Perl風格的數組定義可以讓你不用全部使用引號和逗號定義一個字符串的數組。關鍵字return可以生路。
27. 豐富的庫函數。 Ruby提供了線程,socket,有限對象持久化,CGI,服務器端可執行的,數據庫等其它庫函數,還有對Tk的支持等。還有很多其它的庫函數。
28. 本身自帶調試器(debugger)。 在完美的世界中,我們才不需要調試器,但是這個世界不是完美的。
29. 交互式執行。 可以用Ruby像Kornshell那樣執行。 (這可能是本頁最具爭論的一點,我不得不承認,Ruby真的不是一個很好的shell。但我仍然堅持,基于Ruby的shell是一個不錯的主意。)
30. 它是簡明的。 不像Pascal那樣要求if后面跟著then,while后面跟著do 。變量不需要聲明,它們不需要類型。返回類型不必指定,關鍵字return 可以省略,它將返回最后一個表達式的值。另一方面,它也不像Perl或者C那樣復雜難懂。
31. 它是面向表達式的(expression-oriented)。 你可以輕易的使用 x = if a<0 then b else c 這樣的表達式。
32. 語法砂糖(syntax sugar)。 (像Mary Poppins解釋:一勺語法的糖能使語義被接受)
。如果你想對數組x進行迭代,可以用for a in
x。你也可以用a+=b代替a=a+b,這都行。很多操作符其實在Ruby中都是方法,這些方法的名字比較直觀,短小,有著便利的語法。
33.
它支持操作符重載。如果我沒有記錯的話,早在很久之前的SNOBOL就提供了這個功能,但是直到C++它才變得流行。雖然它可能亂用而出錯,但是這仍是一
個非常不錯的優點。另外Ruby自動定義操作符的賦值版本,比如,如果你重定義了+,那么,你同時得到了一個+=操作符。
34. 支持無限精度的數字。 有人會關心 short, int, long嗎,只需要使用 Bignum就行了,你可以輕松的實現365的階乘。
35.
有冪操作符。在很久以前,我們在BASIC和FORTRAN中使用它,然而當我們學習Pascal和C之后,我們才認識到這個操作符有多差勁。(我們被告
知自己連它是怎么工作的都不知道-它使用了對數,迭代了嗎,效率如何?),但是,我們真的關系這些嗎?如果是,我們可以重寫這個方法,否則,Ruby有非
常好的* *(星號之間無空格)操作符可以用。
36. 強大的字符串處理。 If如果你想查找,判斷,格式化,trim,定界(delimit),interpose,tokenize,你可以自己選擇隨便用哪一個來得到你想要的結果。
37. 規則很少引起異常。 Ruby的語法和語義比其它語言有條理,每種語言都有獨特的一面,每條規則都會有異常發生,但是Ruby規則引起的異常就少的多了。