第1 章 我為什麼開發Ruby 1
1.1 我為什麼開發Ruby 2
1.1.1 編程語言的重要性 2
1.1.2 Ruby 的原則 3
1.1.3 簡潔性 4
1.1.4 擴展性 5
1.1.5 穩定性 6
1.1.6 一切皆因興趣 7
第2 章 麵嚮對象 9
2.1 編程和麵嚮對象的關係 10
2.1.1 顛倒的構造 10
2.1.2 主宰計算機的武器 11
2.1.3 怎樣寫程序 12
2.1.4 麵嚮對象的編程方法 12
2.1.5 麵嚮對象的難點 13
2.1.6 多態性 13
2.1.7 具體的程序 14
2.1.8 多態性的優點 15
2.2 數據抽象和繼承 16
2.2.1 麵嚮對象的曆史 16
2.2.2 復雜性是麵嚮對象的敵人 18
2.2.3 結構化編程 18
2.2.4 數據抽象化 19
2.2.5 雛形 21
2.2.6 找齣相似的部分來繼承 22
2.3 多重繼承的缺點 23
2.3.1 為什麼需要多重繼承 23
2.3.2 多重繼承和單一繼承不可分離 24
2.3.3 goto 語句和多重繼承比較相似 25
2.3.4 解決多重繼承的問題 25
2.3.5 靜態語言和動態語言的區彆 26
2.3.6 靜態語言的特點 26
2.3.7 動態語言的特點 27
2.3.8 靜態語言和動態語言的比較 27
2.3.9 繼承的兩種含義 28
2.3.10 接口的缺點 28
2.3.11 繼承實現的方法 29
2.3.12 從多重繼承變形而來的Mix-in 29
2.3.13 積極支持Mix-in 的Ruby 30
2.4 兩個誤解 31
2.4.1 麵嚮對象的編程 31
2.4.2 對象的模闆 = 類 33
2.4.3 利用模塊的手段=繼承 33
2.4.4 多重繼承不好嗎 34
2.4.5 動態編程語言也需要多重繼承 35
2.4.6 馴服多重繼承的方法 35
2.4.7 Ruby 中多重繼承的實現方法 37
2.4.8 Java 實現多重繼承的方法 38
2.5 Duck Typing 誕生之前 39
2.5.1 為什麼需要類型 39
2.5.2 動態的類型是從Lisp 中誕生的 40
2.5.3 動態類型在麵嚮對象中發展起來瞭 41
2.5.4 動態類型和靜態類型的邂逅 42
2.5.5 靜態類型的優點 42
2.5.6 動態類型的優點 43
2.5.7 隻關心行為的Duck Typing 44
2.5.8 避免明確的類型檢查 45
2.5.9 剋服動態類型的缺點 46
2.5.10 動態編程語言 46
2.6 元編程 46
2.6.1 元編程 46
2.6.2 反射 47
2.6.3 元編程的例子 48
2.6.4 使用反射功能 48
2.6.5 分布式Ruby 的實現 49
2.6.6 數據庫的應用 50
2.6.7 輸齣XML 51
2.6.8 元編程和小編程語言 51
2.6.9 聲明的實現 52
2.6.10 上下文相關的實現 52
2.6.11 單位的實現 53
2.6.12 詞匯的實現 53
2.6.13 層次數據的實現 54
2.6.14 適閤DSL 的語言,不適閤DSL 的語言 54
第3 章 程序塊 57
3.1 程序塊的威力 58
3.1.1 把函數作為參數的高階函數 58
3.1.2 C 語言高階函數的局限 59
3.1.3 可以保存外部環境的閉包 60
3.1.4 塊的兩種使用方法 60
3.1.5 最終來看,塊到底是什麼 61
3.1.6 塊在循環處理中的應用 62
3.1.7 內部迭代器和外部迭代器 62
3.1.8 在排序和比較大小中的應用 63
3.1.9 用塊保證程序的後處理 63
3.1.10 用塊實現新的控製結構 64
3.1.11 在迴調中使用塊 65
3.1.12 塊處理的特彆理由 65
3.2 用塊作循環 66
3.2. 1 塊是處理的集閤 67
3.2.2 塊應用範圍的擴展 68
3.2.3 高階函數和塊的本質一樣 69
3.2.4 用Enumerable 來利用塊 69
3.2.5 Enumerable 的局限 74
3.3 精通集閤的使用 77
3.3.1 使用Ruby 的數組 77
3.3.2 修改指定範圍的元素內容 78
3.3.3 Ruby 中的哈希處理 78
3.3.4 支持循環的Enumerable 79
3.3.5 用於循環的each 方法 81
3.3.6 使用inject、zip 和grep 81
3.3.7 用來指定條件的select 方法 82
3.3.8 排序與比較大小的方法 83
3.3.9 在類中包含(include)Enumerable 模塊 84
3.3.10 List 的內部包和塊的區彆 85
第4 章 設計模式 89
4.1 設計模式(1) 90
4.1.1 設計模式的價值和意義 91
4.1.2 設計模式是程序抽象化的延伸 92
4.1.3 Ruby 中的設計模式 92
4.1.4 Singleton 模式 92
4.1.5 Proxy 模式 94
4.1.6 Iterator 模式 95
4.1.7 外部與內部,哪一個更好 96
4.1.8 內部迭代器的缺陷 97
4.1.9 外部迭代器的缺陷 98
4.2 設計模式(2) 98
4.2.1 模式與動態語言的關係 99
4.2.2 重復使用既存對象的Prototype模式 99
4.2.3 親身體驗Io 語言 100
4.2.4 Ruby 中的原型 101
4.2.5 編寫抽象算法的Template Method模式 101
4.2.6 用Ruby 來嘗試TemplateMethod 102
4.2.7 動態語言與Template Method模式 104
4.2.8 避免高度依賴性的Observer模式 104
4.2.9 Observable 模塊 105
4.2.10 Observer 模式與動態語言 107
4.3 設計模式(3) 107
4.3.1 軟件開發的悲劇 108
4.3.2 開放— 封閉原則 108
4.3.3 麵嚮對象的情況 109
4.3.4 非麵嚮對象的情況 110
4.3.5 OCP 與Template Method 模式 111
4.3.6 Observer 模式 113
4.3.7 使用Strategy 模式 114
4.3.8 Strategy 模式與OCP 116
第5 章 Ajax 119
5.1 Ajax 和JavaScript(前篇) 120
5.1.1 通信及異步頁麵更新 120
5.1.2 技術要素之一:JavaScript 122
5.1.3 技術要素之二:XML 122
5.1.4 XML 以外的數據錶現形式 123
5.1.5 技術要素之三:DHTML 124
5.1.6 JavaScript 技術基礎 124
5.1.7 原型模式的麵嚮對象編程語言 126
5.1.8 使用prototype.js 庫 127
5.1.9 prototype.js 的功能 127
5.2 Ajax 和JavaScript(後篇) 130
5.2.1 巧妙使用DHTML 131
5.2.2 獲取document 節點 132
5.2.3 獲取和更新標簽數據 133
5.2.4 設定事件處理程序 133
5.2.5 追加標簽節點 135
5.2.6 本地HTML 應用 135
5.2.7 和服務器間的通信 137
5.2.8 使用Prototype.js 的優點 138
5.2.9 在服務器上保存數據 138
5.2.10 Web 應用的脆弱性 140
5.2.11 使用JavaScript 的感覺 141
第6 章 Ruby on Rails 143
6.1 MVC 和Ruby on Rails 144
6.1.1 模型、視圖和控製的作用 144
6.1.2 用秒錶的例子來學習MVC模式 145
6.1.3 生成視圖和控製部分 147
6.1.4 GUI 工具箱與MVC 148
6.1.5 同時使用工具箱和MVC 149
6.1.6 MVC 的優缺點 151
6.1.7 Web 應用中的MVC 152
6.2 開放類和猴子補丁 153
6.2.1 開放類 154
6.2.2 猴子補丁的目的 154
6.2.3 猴子補丁的技巧 155
6.2.4 靈活使用開放類的庫 159
6.2.5 猴子補丁的幾點問題 161
6.2.6 其他辦法 162
6.2.7 Ruby on Rails 和開放類 165
6.2.8 ActiveSupport 帶來的擴展 166
6.2.9 字節單位係列 168
6.2.10 復數形和序數 168
6.2.11 大規模開發和Ruby 169
6.2.12 信賴性模型 170
6.2.13 猴子補丁的未來 170
第7 章 文字編碼 173
7.1 文字編碼的種類 174
7.1.1 早期的文字編碼 174
7.1.2 紙帶與文字錶現 175
7.1.3 文字是什麼 176
7.1.4 走嚮英語以外的語言(歐洲篇) 177
7.1.5 英語以外的語言(亞洲篇) 177
7.1.6 Unicode 的問世 180
7.1.7 統一編碼成16 位的漢字統閤 181
7.1.8 Unicode 的兩個問題 181
7.1.9 Unicode 的文字集 182
7.1.10 文字錶示的不確定性 183
7.1.11 Unicode 的字符編碼方式 183
7.2 程序中的文字處理 185
7.2.1 文字編碼有多個意思 185
7.2.2 隻能處理文字集中包含的文字 185
7.2.3 紛繁復雜的文字編碼方式 186
7.2.4 影響力漸微的Shift_JIS 與EUC-JP 186
7.2.5 Unicode 有多種字符編碼方式 186
7.2.6 為什麼會發生亂碼 188
7.2.7 字符編碼方式錯誤 188
7.2.8 沒有字體 189
7.2.9 變換為內部碼時齣錯 189
7.2.10 發生不完全變換 189
7.2.11 文字集的不同 190
7.2.12 字節順序錯誤 191
7.2.13 從編程語言的角度處理文字 191
7.2.14 以變換為前提的UCS 方式 191
7.2.15 原封不動處理的CSI 方式 192
7.2.16 使用UTF-16 的Java 192
7.2.17 使用UTF-8 的Perl 193
7.2.18 用UTF-16 的Python 194
7.2.19 采用CSI 方式的Ruby 1.8 194
7.2.20 強化瞭功能的Ruby 1.9 195
7.2.21 是UCS 還是CSI 196
第8 章 正則錶達式 199
8.1 正則錶達式基礎 200
8.1.1 檢索“像那樣的東西” 200
8.1.2 正則錶達式的語法 200
8.1.3 3 個陷阱 203
8.1.4 正則錶達式對象 204
8.1.5 選項 205
8.1.6 正則錶達式匹配的方法 206
8.1.7 特殊變量 207
8.1.8 字符串與正則錶達式 207
8.1.9 split 的本質 207
8.1.10 字符串的掃描 208
8.1.11 置換 208
8.2 正則錶達式的應用實例與“鬼車” 210
8.2.1 解析日誌文件的方法 211
8.2.2 避免使用$的方法 213
8.2.3 從郵件中取齣日期的方法 215
8.2.4 典型拼寫錯誤的檢索方法 216
8.2.5 Ruby 1.9 的新功能“鬼車” 216
第9 章 整數和浮點小數 219
9.1 深奧的整數世界 220
9.1.1 整數是有範圍的 221
9.1.2 嘗試位運算 222
9.1.3 操作特定的位 223
9.1.4 錶示負數的辦法 225
9.1.5 Ruby 的整數 226
9.1.6 挑戰公開密鑰方式 227
9.2 撲朔迷離的浮點小數世界 228
9.2.1 計算機對小數的處理 229
9.2.2 固定小數點數不易使用 229
9.2.3 科學計數法也有問題 229
9.2.4 小數不能完全錶示 230
9.2.5 有不能比較的時候 231
9.2.6 誤差積纍 232
9.2.7 不是數的特彆“數” 232
9.2.8 計算誤差有多種 233
9.2.9 誤差導緻的嚴重問題 235
9.2.10 BigDecimal 是什麼 236
9.2.11 能夠錶示分數的Rational類 236
第10 章 高速執行和並行處理 239
10.1 讓程序高速執行(前篇) 240
10.1.1 是不是越快越好 240
10.1.2 高速執行的樂趣與效率 240
10.1.3 以數據為基礎作齣判斷 241
10.1.4 改善係統調用 241
10.1.5 數據可靠嗎 243
10.1.6 隻需改善瓶頸 243
10.1.7 profiler 本身成瞭纍贅 245
10.1.8 算法與數據結構 245
10.1.9 理解O 記法 245
10.1.10 選擇算法 246
10.1.11 調查算法的性能 246
10.1.12 高速執行的悲哀 247
10.1.13 性能優化的格言 248
10.2 讓程序高速執行(後篇) 248
10.2.1 確認程序概要 249
10.2.2 發現瓶頸 250
10.2.3 使用更好的profiler 251
10.2.4 高速優化之一:削減對象 252
10.2.5 高速優化之二:利用立即值 254
10.2.6 高速優化之三:利用C 語言 255
10.2.7 高速優化之四:采用閤適的數據結構 256
10.2.8 全部以C 語言計算 257
10.2.9 還存在其他技巧 257
10.3 並行編程 258
10.3.1 使用綫程的理由 258
10.3.2 生成綫程 259
10.3.3 綫程的執行狀態 260
10.3.4 傳遞值給綫程的方法 261
10.3.5 信息共有所産生的問題 262
10.3.6 數據完整性的喪失 262
10.3.7 死鎖 263
10.3.8 用鎖來實現對資源的獨占 264
10.3.9 二級互斥 265
10.3.10 用隊列協調綫程 265
10.3.11 鎖模型與隊列模型的比較 267
10.4 前景可期的並行編程技術,Actor 268
10.4.1 何謂Actor 268
10.4.2 操作Actor 的3 種處理係統 269
10.4.3 Erlang 的程序 270
10.4.4 Pingpong 處理的開始 270
10.4.5 啓動pingpong 程序 271
10.4.6 Erlang 的錯誤處理 272
10.4.7 Erlang 的使用場所 273
10.4.8 麵嚮Ruby 的庫“Revactor” 273
10.4.9 Revactor 的應用場閤 274
10.4.10 另一個庫Dramatis 275
第11 章 程序安全性 279
11.1 程序的漏洞與攻擊方法 280
11.1.1 4 種軟件漏洞 280
11.1.2 因權限被竊取而成為重大問題 281
11.1.3 安全問題的根源 281
11.1.4 “守護神”引起的問題 282
11.1.5 多 樣化的攻擊手段 282
11.1.6 緩衝區溢齣 283
11.1.7 整數溢齣 284
11.1.8 SQL 注入 285
11.1.9 Shell 注入 286
11.1.10 跨站點腳本攻擊 287
11.1.11 跨站點僞造請求 288
11.1.12 社會工程 289
11.2 用異常進行錯誤處理 290
11.2.1 異常的曆史 292
11.2.2 Java 的受控異常 292
11.2.3 Icon 的麵嚮目標判斷 293
11.2.4 Ruby 的異常 294
11.2.5 異常發生 295
11.2.6 異常類 296
11.2.7 異常處理的設計方針 297
11.2.8 異常發生的設計原則 298
第12 章 關於時間的處理 301
12.1 用程序處理時刻與時間 302
12.1.1 時差與時區 302
12.1.2 世界協調時間 302
12.1.3 夏令時(DST) 303
12.1.4 改曆 304
12.1.5 日期與時間的類 305
12.1.6 2038 年問題 308
12.1.7 DateTime 類 309
12.1.8 Time 與DateTime 的相互變換 310
第13 章 關於數據的持久化 313
13.1 持久化數據的方法 314
13.1.1 保存文本 314
13.1.2 變換成文本的Marshal 314
13.1.3 使用Marshal 模塊 315
13.1.4 復製有兩種方式 316
13.1.5 仔細看Marshal 的格式 316
13.1.6 不能保存的3 類對象 317
13.1.7 製作麵嚮對象數據庫 318
13.1.8 試用PStore 318
13.1.9 變換為文本的YAML 320
13.1.10 用YAML 製作數據庫 321
13.2 對象的保存 322
13.2.1 高速的Object Prevalence 322
13.2.2 Object Prevalence 的問題點 323
13.2.3 使用Madeleine 323
13.2.4 訪問時刻信息 325
13.2.5 讓Madeleine 更容易使用 326
13.2.6 Madeleine 的實用例Instiki 328
13.3 關於XML 的考察 328
13.3.1 XML 的祖先是SGML 329
13.3.2 XML 是樹結構的數據錶現 329
13.3.3 優點在於純文本 330
13.3.4 缺點在於冗長 331
13.3.5 不適閤重視效率的處理 331
13.3.6 適閤於信息交換的格式 332
13.3.7 XML 的解析 332
13.3.8 XML 處理庫REXML 333
13.3.9 XML 的代替 336
第14 章 函數式編程 339
14.1 新範型——函數式編程 340
14.1.1 具有多種函數式性質的Lisp 341
14.1.2 徹底的函數式編程語言Haskell 342
14.1.3 延遲計算:不必要的處理就不做 343
14.1.4 靈活的“靜態多態性”類型係統 344
14.1.5 近代函數式語言之父OCaml 345
14.1.6 強於並行計算的Erlang 345
14.1.7 用Ruby 進行函數式編程 346
14.1.8 用枚舉器來實現延遲計算 347
14.2 自動生成代碼 348
14.2.1 在商業中利用Ruby 349
14.2.2 使用Ruby 自動生成代碼 350
14.2.3 消除重復代碼 350
14.2.4 代碼生成的應用 351
14.2.5 代碼生成的效果 352
14.2.6 編寫代碼生成器 353
14.2.7 也可以使用XML 354
14.2.8 在EJB 中使用代碼生成 355
14.3 內 存管理與垃圾收集 356
14.3.1 內存管理的睏難 357
14.3.2 垃圾收集亮相之前 358
14.3.3 評價垃圾收集的兩個指標 359
14.3.4 垃圾收集算法 360
14.3.5 引用計數方式 360
14.3.6 標記和掃除方式 361
14.3.7 標記和緊縮方式 362
14.3.8 復製方式 363
14.3.9 多種多樣的垃圾收集算法 364
14.3.10 分代垃圾收集 364
14.3.11 保守垃圾收集 366
14.3.12 增量垃圾收集 366
14.3.13 並行垃圾收集 367
14.3.14 位圖標記 367
14.4 用C 語言來擴展Ruby 368
14.4.1 開發與執行速度的取捨 368
14.4.2 擴展庫 369
14.4.3 看例題學習擴展模塊 370
14.4.4 QDBM 函數 372
14.4.5 初始化對象 373
14.4.6 實現方法 374
14.4.7 關於垃圾收集的注意事項 376
14.4.8 其他的Ruby API 376
14.4.9 擴展庫的編譯 376
14.4.10 擴展庫以外的工具 377
14.5 為什麼要開源 380
14.5.1 自由軟件的思想 380
14.5.2 自由軟件的曆史 381
14.5.3 Emacs 事件的發生 381
14.5.4 開源的誕生 382
14.5.5 OSS 許可證 383
14.5.6 開源的背景 385
14.5.7 企業關注開源的理由 386
14.5.8 Ruby 與開源 386
14.5.9 選擇許可證的方法 387
· · · · · · (
收起)