作者:於天恩 北京航天航空出版社出版發行。
Ruby是一種語言,其單詞含義為“紅寶石”。Rails是一種技術架構,其單詞意思為“鐵軌”。於是“Ruby on Rails”的含義就是鋪滿紅寶石的鐵軌。Rails是B/S結構的編程架構,基於Ruby語言。這類似於ASP基於VBScript和JSP(Struts)基於Java。
單獨學習Ruby是可以的,你可以使用Ruby去編寫各種程式。不過,通常人們不會這麼做,對我而言,最好的萬能語言是Java,用JBuilder開發Java程式是非常舒服的。如果你也不打算使用Ruby作為萬能語言的話,那麼最好使用它來做Web開發,也就是使用Ruby on Rails架構,這是Ruby最好的應用。
生而知之者,上也;學而知之者,次也;困而知之者,又其次也。
“人事有可陷者,亦有不可陷者”,陷於技術,不值得。
悟性,因人而異,不可強求,慾望,因人而異,不應執著。
誠然人的天資很重要,非常重要,相當重要。但有幾句話要提醒讀者:“勤能補拙是良訓,一分辛勞一分才”。天資是天給的,不是人定的。但在天資之外,你還有很多事情可以做,通過勤奮、堅持、刻苦,縱然超不過天才,你也定然能成為超越常人的天才。
Ruby語言的特點:(1)解釋執行,不需要編譯即可運行,調高了調試速度,不過執行效率低。(2)變數無類型,錯誤檢查能力變弱,區分大小寫。(3)變數不需要聲明(4)不需要記憶體管理,能自動回收不再實用的對象。(5)純粹的物件導向,包括整數等基礎資料型別 (Elementary Data Type)都是對象,它們都有發送訊息的統一介面。(6)迭代器,將迴圈抽象化,從而使得代碼簡潔。(7)功能強大的字串操作(8)超長整數(9)可以直接存取作業系統,因此單獨使用Ruby也可以進行系統編程。(10)用模組進行混合插入,捨棄了多重繼承,使用模組來超越類的界限以共用資料和方法等。(11)閉包,可以將某過程片段對象化。(12)動態載入,可以在運行時讀入對象檔案。
第一章 Ruby語言基礎
特別注意安裝版本如果是1.9.x的不支援中文,因為最好安裝1.8.x。
(1)Ruby中的引號包含單引號和雙引號,單引號中可以包含雙引號,雙引號中也可以包含單引號。大多數情況下,這兩種符號是通用的。
(2)逸出字元:\、\t、\n。
(3)連句符:分號就是語句的串連符。分行符號:\n。注意:如果被輸出字串不是以分行符號結尾,puts方法就會在輸出的語句後增加一個分行符號;如果輸出字串以分行符號結尾,那麼puts方法就不會在語句結尾增加分行符號。
(4)連行符:當語句過長時,會影響閱讀,希望分成多行去寫。一種方式是使用字串串連符來串連語句,但字串串連符屬於運算子,會消耗資源。而連行符屬于格式控制字元“\”。
(5)注釋符:單行注釋使用“#”;多行注釋使用“=begin”和“=end”塊。
(6)局部變數:即普通變數,在Ruby中由小寫字母或底線開頭,局部變數在使用之前如果不初始化,將會出錯。。
(7)基本輸入:Ruby中使用gets方法來解決最基本的輸入問題。例如,可以用a = gets來將使用者輸入的字元儲存在局部變數a中。
(8)基本輸出:puts和print。
(9)數字和字串串連:Ruby支援整型和浮點型。使用“+”作為字串串連符號。
**************************************************************************************************
(1)類:Ruby的物件導向比Java純粹,一切都是對象。所以,Ruby中沒有函數,只有方法;Ruby中所有的變數、常量都不能脫離類存在。
(2)最簡單的類:屬性+方法。在Ruby中,類名以大寫字母開頭,執行個體屬性以“@”開頭,變數和方法名應該用一個小寫字母或者底線開頭。定義類的方法是用“def...end”語句塊,如果需要方法傳回值,可用“return”語句。類的初始化使用“initialize”方法。
(3)類的基本使用:Ruby是用new方法來構建類的執行個體,如:m=Man.new。構造執行個體之後,就可以使用類的方法。
(4)繼承:Ruby是用“<”符號來實作類別的繼承,這與Java中的“extends”及C++中的“:”不同。在子類中增強父類方法要使用“super”作為關鍵字(如果要加強的父類方法有參數,那麼就用super(參數)的方式來加強)。
(5)單態方法:Ruby是弱類型語言,只有重寫,沒有重載。故沒有辦法顯示出其多態性。但是Ruby有單態方法,這意味著,從某個共同的類衍生出的多個對象可以擁有各自不同的方法。
(6)方法存取控制:在Ruby中只有方法,沒有函數,每一種方法都是存在於類中的。那麼,如果不在任何類中的定義的方法,應該屬於Object類。理論上講,這個方法可以被所有的對象使用,但如果是真的,這樣就亂了。所以,Ruby將其實現為Object類的私人方法,於是,它不能被對象使用。Ruby中提供了三個關鍵字來限制對方法的存取:pubulic,可以為任何對象所存取的方法(public是所有方法的預設設定);protected,可以在定義它的執行個體或者子類的執行個體中調用;private,只可以在這個方法所處的對象中被使用,不能直接調用另一個對象的private方法,包括調用自身也不允許。 這些關鍵字被插在兩個方法之間的代碼中,所有從private關鍵字開始定義的方法都為私人的,知道代碼中出現另一個存取控制關鍵字為止。一個類的initialize方法自動為私人的。(除了在方法之前設定其存取權限之外,還可以在方法定義之後設定,如:public:free private:sayname,:sayage)。
(7)屬性讀寫控制:類中的屬性,包括唯讀屬性、唯寫屬性和讀寫屬性。通過類似set和get的函數來進行設定。
(8)垃圾收集:Ruby實現了自動的記憶體管理,實現了垃圾收集。它沒有類似Java的finalize方法,但它有類似.NET的GC類用來實現垃圾清理和記憶體回收。GC類具有disable、enable、start、garbage_collect4個方法,其中前兩個是關閉和啟動垃圾收集器,start方法和garbage_collect意義相同,都是調用start方法來實現垃圾收集功能。
(9)異常處理:Ruby使用begin...rescue...end結構來處理異常,這類似於Java中的try...catch...finally。應用方法是一直的,都是在某個塊中監視,找到異常就處理。retry語句可以重新執行begin塊中的內容。Ruby中使用raise語句拋出異常,類似於Java的throw語句。異常的資訊可以被全域變數$!獲得。Ruby中使用ensure語句來實現語句塊的最後清理,類似於Java中的finally。注意:在begin...rescue...end塊中可以只使用ensure或rescue(這類似於try...catch...fiannly),但如果同時使用ensure和rescue,那麼ensure必須在rescue後面。
**************************************************************************************************
(1)Ruby有三類變數、一種常量和兩種嚴格意義上的為變數,變數和常量都沒有類型。在Ruby裡不需要聲明變數,由首字母標識符將常量和變數分類。
變數類型描述 樣本
局部變數 以小寫字母或底線卡頭 var _var
全域變數 以$開頭 $var
類變數 類中定義,以@@開頭 @@var
執行個體變數 對象中定義,以@開頭 @var
常量 以大寫字母開頭 Var
注意:Ruby的為變數self永遠指向當前正執行著的對象或未初始設定變數的空值nil。雖然這兩者的命名都像是局部變數,但self是由解譯器把持的全域變數,而nil實際上是個常量。
(2)常量:常量由大寫字母開頭,最多被賦值一次。不過如果賦值多次,只會產生警告,不會產生錯誤。
(3)全域變數:全域變數由“$”開頭,可以再程式的任何位置訪問到。在初始化前,全域變數有個有一個特殊的值nil。
$!:最近一次的錯誤資訊; $_:gets最近讀的字串; $&:最近一次與Regex匹配的字串 $n:最近匹配的n個子運算式 $/:輸入記錄分隔字元 $0:Ruby指令碼的檔案名稱 $$:解譯器進程ID $@:錯誤產生的位置 $.:解譯器最近讀的行數 $~:作為子運算式組的最近一次匹配 $=:是否區別大小寫標誌 $\:輸出記錄風格福 $*:命令列參數 $?:最近一次執行的子進程的退出狀態。
(4)unless語句:用於選擇條件,是“if”選擇的否定版。多重選取語句:case(與when進行組合),相當於C++中的switch語句。
(5)while迴圈:單行while迴圈 單條語句 while 條件;until迴圈 until 條件 代碼 end;for...in迴圈 for 變數 in 集合對象 對象 end。
迴圈控制:break 跳出當前迴圈;next 忽略本次迴圈的剩餘部分,開始下一次的迴圈,相當於C中的continue;redo 不檢查迴圈條件,重新開始當前迴圈;retry 從頭開始重複這個迴圈體。
(6)塊:它是一種可以和方法調用相關聯的代碼塊。塊是在大括弧或者do...end之間的一組代碼。使用Ruby的yield語句方法可以一次或多次的調用相關聯的塊。帶參數的塊,參數被兩條豎線包圍,多個參數之間使用逗號分隔。
(7)迭代器是從某種集合對象中連續返回元素的方法。在Ruby庫中大量使用了塊來實現迭代器。數組和區間都屬於集合對象。
(8)過程對象:把一塊代碼作為參數向某個方法傳遞。建立過程對象需要使用proc關鍵字,建立好的過程對象可以使用,通過call方法就能使用這個對象。