本書(shū)以案例形式循序漸進(jìn)講解Ruby對(duì)象模型原理和高級(jí)應(yīng)用技巧,堪稱動(dòng)態(tài)語(yǔ)言的設(shè)計(jì)模式。書(shū)中講述的各種Ruby編程模式,完全可以應(yīng)用于其他動(dòng)態(tài)語(yǔ)言(甚至靜態(tài)語(yǔ)言)。Ruby之父松本行弘作序推薦。
適讀人群 :程序員、動(dòng)態(tài)語(yǔ)言編程愛(ài)好者
元編程是Ruby世界的如意金箍棒,只有能駕馭它的人才能充分發(fā)揮其潛力。
《Ruby元編程(第2版)》在大量剖析實(shí)例代碼的基礎(chǔ)上,詳細(xì)講解了33種元編程技巧。
讀者不僅能學(xué)到對(duì)象模型、作用域、單件類、代碼塊等元編程概念,還將學(xué)習(xí)Rails的組織結(jié)構(gòu)和工作原理,以及如何借助元編程編寫領(lǐng)域?qū)僬Z(yǔ)言。
第2版更新Ruby 2.0、Ruby 2.1內(nèi)容,大部分示例代碼取自流行的軟件框架和類庫(kù),包括Rails4。
Ruby的很多特性繼承自其他語(yǔ)言,這些語(yǔ)言包括Lisp、Smalltalk、C、Perl等。它的元編程特性來(lái)自于Lisp和Smalltalk。元編程有點(diǎn)像魔法,看起來(lái)讓人震驚。世界上有兩種的魔法:好的白魔法和壞的黑魔法。同樣,元編程也有兩面性:你可以用元編程增強(qiáng)語(yǔ)言的功能,還可以創(chuàng)建領(lǐng)域?qū)僬Z(yǔ)言;但是你也可能陷入到元編程的陷阱里。元編程是一種容易讓人迷惑的技術(shù)。
Ruby相信你是一位成熟的程序員,它賦予你元編程這樣強(qiáng)大的能力。但是你必須記。耗芰υ酱螅(zé)任就越大。
請(qǐng)盡情享受Ruby編程吧!
——松本行弘
Paolo Perrotta,有超過(guò)15年的軟件設(shè)計(jì)和開(kāi)發(fā)經(jīng)驗(yàn),他開(kāi)發(fā)過(guò)嵌入式軟件、企業(yè)級(jí)軟件、計(jì)算機(jī)游戲和web應(yīng)用,還發(fā)表過(guò)上百篇技術(shù)文章。他在歐洲各國(guó)教授敏捷課程,過(guò)著游牧般的生活。
第一部分 Ruby元編程
第1章 元這個(gè)字眼
1.1 鬼城與自由市場(chǎng)
1.2 程序員Bob的故事
1.3 元編程和Ruby
第2章 星期一:對(duì)象模型
2.1 打開(kāi)類
2.2 類的真相
2.3 小測(cè)驗(yàn):缺失的連接線
2.4 調(diào)用方法時(shí)發(fā)生了什么?
2.5 小測(cè)驗(yàn):混亂的模塊
2.6 對(duì)象模型小結(jié)
第3章 星期二:方法
3.1 代碼繁復(fù)的問(wèn)題
3.2 動(dòng)態(tài)方法
3.3 method_missing方法
3.4 小測(cè)驗(yàn):消滅Bug
3.5 白板類
3.6 小結(jié)
第4章 星期三:代碼塊
4.1 學(xué)習(xí)代碼塊
4.2 小測(cè)驗(yàn):Ruby的#符號(hào)
4.3 代碼塊是閉包
4.4 instance_eval方法
4.5 可調(diào)用對(duì)象
4.6 編寫領(lǐng)域?qū)僬Z(yǔ)言(DSL)
4.7 小測(cè)驗(yàn):改良的DSL
4.8 小結(jié)
第5章 星期四:類定義
5.1 揭秘類定義
5.2 小測(cè)驗(yàn):Taboo類
5.3 單件方法
5.4 單件類
5.5 小測(cè)驗(yàn):模塊的麻煩
5.6 方法包裝器
5.7 小測(cè)驗(yàn):打破數(shù)學(xué)規(guī)律
5.8 小結(jié)
第6章 星期五:編寫代碼的代碼
6.1 通向周末的編程之路
6.2 Kernel#eval方法
6.3 小測(cè)驗(yàn):校驗(yàn)過(guò)的屬性(第一步)
6.4 小測(cè)驗(yàn):校驗(yàn)過(guò)的屬性(第二步)
6.5 小測(cè)驗(yàn):校驗(yàn)過(guò)的屬性(第三步)
6.6 小測(cè)驗(yàn):校驗(yàn)過(guò)的屬性(第四步)
6.7 鉤子方法
6.8 小測(cè)驗(yàn):校驗(yàn)過(guò)的屬性(第五步)
6.9 小結(jié)
第7章 尾聲
第二部分 Rails中的元編程
第8章 準(zhǔn)備Rails之旅
8.1 Ruby on Rails
8.2 安裝Rails
8.3 Rails源代碼
第9章 Active Record的設(shè)計(jì)
9.1 簡(jiǎn)短的Active Record示例
9.2 Active Record的組成
9.3 經(jīng)驗(yàn)之談
第10章 Active Support的Concern模塊
10.1 Concern模塊出現(xiàn)之前
10.2 ActiveSupport::Concern模塊
10.3 經(jīng)驗(yàn)之談
第11章 alias_method_chain方法沉浮錄
11.1 alias_method_chain方法的興起
11.2 alias_method_chain方法的衰亡
11.3 經(jīng)驗(yàn)之談
第12章 屬性方法的發(fā)展
12.1 屬性方法實(shí)戰(zhàn)
12.2 屬性方法的發(fā)展史
12.3 經(jīng)驗(yàn)之談
第13章 最后的思考
元編程不過(guò)是編程
第三部分 附錄
附錄A 常見(jiàn)慣用法
A.1 擬態(tài)方法
A.2 空指針保護(hù)
A.3 Self Yield
A.4 Symbol#to_proc方法
附錄B 領(lǐng)域?qū)僬Z(yǔ)言
B.1 關(guān)于領(lǐng)域?qū)僬Z(yǔ)言
B.2 內(nèi)部和外部領(lǐng)域?qū)僬Z(yǔ)言
B.3 領(lǐng)域?qū)僬Z(yǔ)言和元編程
附錄C 法術(shù)手冊(cè)
索引
元編程……聽(tīng)起來(lái)很酷!好像是一種用于高級(jí)企業(yè)架構(gòu)的設(shè)計(jì)方法。
事實(shí)上,元編程并非一個(gè)抽象的概念,它是一系列務(wù)實(shí)的編程技巧。在Ruby中,你可以用它完成如下一些工作。
假設(shè)你要寫一個(gè)Ruby程序來(lái)連接外部系統(tǒng)(web服務(wù)或者Java程序),你可以用元編程寫一個(gè)包裝器用于接受任何方法的調(diào)用,然后把這些調(diào)用轉(zhuǎn)發(fā)給外部系統(tǒng)。如果某人后來(lái)為這個(gè)外部系統(tǒng)添加了方法,即使不修改Ruby包裝器,它也能自動(dòng)支持新加入的方法。很神奇吧!
假設(shè)你遇到一類問(wèn)題,需要設(shè)計(jì)某種領(lǐng)域?qū)僬Z(yǔ)言來(lái)解決。如果你從頭定義這門語(yǔ)言,并且自己編寫解析器,工作量就太大了。你可以把Ruby改造成處理這個(gè)問(wèn)題的專屬語(yǔ)言。你甚至可以寫一個(gè)簡(jiǎn)單的解釋器從文件中讀取這種基于Ruby語(yǔ)言的代碼。
你可以把Ruby程序的簡(jiǎn)潔性提高到Java程序員做夢(mèng)都不敢想的程度。比如一個(gè)包含20個(gè)方法的類,這些方法的名字看起來(lái)都差不多。元編程只用幾行代碼就能定義這些方法。如果你想調(diào)用一長(zhǎng)串名字遵循一定的模式(比如名字都以test開(kāi)頭)的方法,元編程只用一行代碼就能調(diào)用它們。
你可以改造Ruby使之滿足你的需要,而不是去適應(yīng)語(yǔ)言本身。例如,可以用你喜歡的方式增強(qiáng)任何一個(gè)類(包括Array這樣的核心類);可以把想要監(jiān)控的方法封裝起來(lái),當(dāng)他人繼承你的類后,就會(huì)執(zhí)行你預(yù)先設(shè)定的代碼……