第1章 Ruby概述 1
1.1 面向对象简介 2
1.1.1 什么是对象 2
1.1.2 继承 3
1.1.3 多态 4
1.1.4 其他术语 5
1.2 基本的Ruby语法和语义 5
1.2.1 关键字和标识符 6
1.2.2 注释和内嵌文档 7
1.2.3 常量、变量和类型 7
1.2.4 运算符及其优先级 8
1.2.5 示例程序 9
1.2.6 循环和分支 11
1.2.7 异常 15
1.3 Ruby中的OOP 16
1.3.1 对象 17
1.3.2 内置类 17
1.3.3 模块和Mixin 18
1.3.4 创建类 19
1.3.5 方法和属性 22
1.4 Ruby的动态方面 23
1.4.1 在运行时编码 23
1.4.2 反射 25
1.4.3 方法找不到 26
1.4.4 垃圾回收(Garbage Collection,GC) 26
1.5 直觉训练:需要记住的内容 26
1.5.1 语法问题 27
1.5.2 编程方面 28
1.5.3 Ruby的case语句 30
1.5.4 Ruby程序员及其习惯用语 32
1.5.5 面向表达式和其他问题 37
1.6 Ruby术语 38
1.7 结语 40
第2章 使用字符串 41
2.1 表示普通字符串 41
2.2 用其他表示法表示字符串 42
2.3 使用Here文档 42
2.4 确定字符串的长度 44
2.5 每次处理一行 44
2.6 每次处理一个字节 44
2.7 执行特殊的字符串比较 45
2.8 将字符串分解为标记 46
2.9 格式化字符串 47
2.10 将字符串用做IO对象 48
2.11 控制大小写 48
2.12 获取和设置子字符串 49
2.13 字符串替换 50
2.14 字符串搜索 51
2.15 在字符和ASCII码之间转换 52
2.16 隐式转换和显式转换 52
2.17 在字符串末尾添加内容 54
2.18 删除末尾的换行符和其他字符 54
2.19 删除字符串中的空白 55
2.20 重复字符串 55
2.21 在字符串中嵌入表达式 55
2.22 字符串的延迟插入 56
2.23 解析逗号分隔的数据 56
2.24 将字符串转换为数字(十进制数和其他进制) 57
2.25 rot13文本编码和解码 58
2.26 字符串加密 59
2.27 字符串压缩 60
2.28 计算字符串中的字符数 60
2.29 字符串反转 61
2.30 删除重复的字符 61
2.31 删除指定的字符 61
2.32 打印特殊字符 62
2.33 生成后续字符串 62
2.34 计算32位的CRC 62
2.35 计算字符串的MD5散列值 63
2.36 计算两个字符串之间的Levenshtein距离 64
2.37 base64字符串的编码和解码 65
2.38 字符串编码和解码(uuencode/uudecode) 66
2.39 扩展和压缩制表符 66
2.40 文本自动换行 67
2.41 结语 67
第3章 使用正则表达式 68
3.1 正则表达式的语法 68
3.2 编辑正则表达式 70
3.3 特殊字符的转义 71
3.4 使用锚 71
3.5 使用量词符(quantifier) 72
3.6 正负预查(Lookahead) 73
3.7 访问后向引用 74
3.8 使用字符类 76
3.9 扩展正则表达式 77
3.10 使用点匹配换行符 78
3.11 使用内嵌选项 78
3.12 使用内嵌子表达式 79
3.13 Ruby与Oniguruma 79
3.13.1 检测是否有Oniguruma 80
3.13.2 编译Oniguruma 80
3.13.3 Oniguruma的一些新特性 81
3.13.4 正负后查(Lookbehind) 82
3.13.5 再谈量词符 82
3.13.6 命名匹配 83
3.13.7 正则表达式中的递归 84
3.14 一些正则表达式示例 85
3.14.1 匹配IP地址 85
3.14.2 匹配关键字—值对 86
3.14.3 匹配罗马数字 86
3.14.4 匹配数值常量 87
3.14.5 匹配日期/时间字符串 87
3.14.6 检测文本中的双词 88
3.14.7 匹配全部大写的单词 88
3.14.8 匹配版本号 88
3.14.9 其他模式 88
3.15 结语 89
第4章 Ruby的国际化 90
4.1 背景与术语 91
4.2 后ASCII时代的编码 93
4.2.1 jcode库与$KCODE 94
4.2.2 再谈常用的字符串和正则表达式操作 95
4.2.3 检测字符编码 98
4.2.4 Unicode字符的规范化 98
4.2.5 字符串排序的问题 99
4.2.6 编码之间的转换 101
4.3 使用消息目录 103
4.3.1 背景与术语 103
4.3.2 开始使用消息目录 104
4.3.3 简单应用程序的本地化 104
4.3.4 其他注意事项 108
4.4 结语 108
第5章 执行数值计算 109
5.1 在Ruby中表示数值 109
5.2 基本数字运算 110
5.3 对浮点数执行舍入 110
5.4 比较浮点数 112
5.5 格式化输出的数值 113
5.6 用逗号格式化数值 113
5.7 使用超大型整数 114
5.8 使用BigDecimal 114
5.9 处理有理数 116
5.10 矩阵运算 116
5.11 处理复数 119
5.12 使用mathn 120
5.13 因子分解、最大公约数和最小公倍数 121
5.14 处理素数 121
5.15 隐式与显式数值转换 122
5.16 数值的协同转换(coercing) 123
5.17 对数值执行按位运算 124
5.18 执行进制转换 125
5.19 计算立方根、四次方根等 125
5.20 确定体系结构的字节顺序 126
5.21 定积分的数值计算 127
5.22 以度、弧度、分度为单位的三角计算 127
5.23 高级三角函数 128
5.24 计算以任何数为底的对数 128
5.25 计算数据集的均值、中值和众数 129
5.26 方差和标准差 130
5.27 计算相关系数 130
5.28 生成随机数 132
5.29 使用memoize缓存函数结果 132
5.30 结语 133
第6章 符号和范围 134
6.1 符号 134
6.1.1 作为枚举的符号 135
6.1.2 作为元值(metavalue)的符号 136
6.1.3 符号、变量和方法 136
6.1.4 符号的转换 137
6.2 范围 138
6.2.1 开范围和闭范围 138
6.2.2 查找终点 138
6.2.3 对范围进行迭代 139
6.2.4 测试是否在范围内 139
6.2.5 转换为数组 140
6.2.6 反向范围 140
6.2.7 flip-flop运算符 140
6.2.8 自定义的范围 143
6.3 结语 145
第7章 处理时间和日期 146
7.1 确定当前时间 146
7.2 处理特定的时间(纪元后) 147
7.3 确定星期几 148
7.4 确定复活节的日期 148
7.5 计算一个月内的第几个星期几 149
7.6 秒与更大时间单位之间的转换 150
7.7 其他时间和纪元之间的转换 150
7.8 不要使用闰秒 151
7.9 计算一年中的第几天 151
7.10 验证日期/时间 151
7.11 计算一年的第几周 152
7.12 检测闰年 153
7.13 获得时区 153
7.14 只使用小时与分钟 154
7.15 比较日期/时间值 154
7.16 给日期/时间值增加间隔 154
7.17 计算两个日期/时间值的差 155
7.18 处理特定的日期(纪元前) 155
7.19 Time、Date、DateTime之间的转换 155
7.20 从字符串中提取日期/时间值 156
7.21 日期/时间值的格式化和输出 157
7.22 时区转换 158
7.23 计算一个月的天数 158
7.24 将月划分为周 159
7.25 结语 160
第8章 数组、散列及其他枚举类型 161
8.1 使用数组 161
8.1.1 数组的创建和初始化 162
8.1.2 数组元素的访问和赋值 162
8.1.3 确定数组的长度 163
8.1.4 数组的比较 163
8.1.5 数组的排序 165
8.1.6 根据条件从数组中选择 167
8.1.7 使用专门的索引函数 168
8.1.8 实现稀疏矩阵 169
8.1.9 使用数组作为数学集合 170
8.1.10 数组的随机化 173
8.1.11 使用多维数组 173
8.1.12 找出在一个数组中而不在另一个数组中的元素 174
8.1.13 数组的变换或映射 174
8.1.14 删除数组中的nil元素 175
8.1.15 删除特定的数组元素 175
8.1.16 数组的拼接和附加 176
8.1.17 将数组用做栈或队列 177
8.1.18 对数组进行迭代 177
8.1.19 插入分隔符以形成字符串 178
8.1.20 颠倒数组 178
8.1.21 删除数组中的重复元素 178
8.1.22 数组的交织 178
8.1.23 计算数组中值的频率 179
8.1.24 将数组颠倒为散列 179
8.1.25 同步多个数组的排序 179
8.1.26 给新数组元素指定默认值 180
8.2 使用散列 181
8.2.1 创建新散列 181
8.2.2 指定散列的默认值 182
8.2.3 访问和添加键—值对 182
8.2.4 删除键—值对 183
8.2.5 对散列进行迭代 184
8.2.6 散列的颠倒 184
8.2.7 检测散列中的键和值 184
8.2.8 将散列提取为数组 185
8.2.9 根据条件选择键—值对 185
8.2.10 散列的排序 186
8.2.11 合并两个散列 186
8.2.12 从数组创建散列 186
8.2.13 计算散列键的差集和交集 187
8.2.14 将散列用做稀疏矩阵 187
8.2.15 实现包含重复键的散列 187
8.3 枚举概述 190
8.3.1 inject方法 190
8.3.2 使用量词符 191
8.3.3 partition方法 192
8.3.4 分组迭代 193
8.3.5 转换为数组或集合 193
8.3.6 使用Enumerator对象 194
8.3.7 使用Generator对象 195
8.4 结语 196
第9章 高级数据结构 197
9.1 使用集合 197
9.1.1 简单的集合操作 198
9.1.2 高级集合操作 199
9.2 使用栈和队列 200
9.2.1 实现严谨的栈 200
9.2.2 检测表达式中不配对的标点 201
9.2.3 理解栈和递归 202
9.2.4 实现严谨的队列 203
9.3 使用树 204
9.3.1 实现二叉树 204
9.3.2 使用二叉树排序 206
9.3.3 将二叉树用做查询表 207
9.3.4 将树转换为字符串或数组 207
9.4 使用图 208
9.4.1 使用邻接矩阵实现图 209
9.4.2 确定图是否全连通 211
9.4.3 检测图是否包含欧拉回路 212
9.4.4 判断图是否有欧拉路径 212
9.4.5 Ruby中的图工具 213
9.5 结语 213
第10章 I/O和数据存储 214
10.1 处理文件和目录 215
10.1.1 打开和关闭文件 215
10.1.2 更新文件 216
10.1.3 文件的追加 216
10.1.4 随机存取文件 216
10.1.5 处理二进制文件 217
10.1.6 锁定文件 218
10.1.7 执行简单的I/O操作 219
10.1.8 执行缓冲I/O和非缓冲I/O操作 220
10.1.9 操作文件所有者和权限 220
10.1.10 获取和设置时间戳信息 222
10.1.11 检查文件是否存在及其大小 223
10.1.12 检查特殊的文件属性 223
10.1.13 使用管道 225
10.1.14 执行特殊的I/O操作 226
10.1.15 使用非阻断I/O 226
10.1.16 使用readpartial 227
10.1.17 操作路径名 227
10.1.18 使用Pathname类 228
10.1.19 命令级文件操作 229
10.1.20 从键盘抓取字符 230
10.1.21 将整个文件读取到内存中 230
10.1.22 逐行对文件进行迭代 231
10.1.23 逐字节对文件进行迭代 231
10.1.24 将字符串视为文件 231
10.1.25 读取程序内嵌的数据 232
10.1.26 读取程序的源代码 233
10.1.27 处理临时文件 233
10.1.28 改变和设置当前目录 233
10.1.29 改变当前根目录 234
10.1.30 迭代目录项 234
10.1.31 获取目录项列表 234
10.1.32 创建目录链 234
10.1.33 递归地删除目录 235
10.1.34 查找文件和目录 235
10.2 执行高级数据访问 236
10.2.1 简单序列化 236
10.2.2 更复杂的序列化 237
10.2.3 使用Marshal执行有限的“深拷贝” 238
10.2.4 使用Pstore执行更好的对象持久化 238
10.2.5 处理CSV数据 239
10.2.6 使用YAML进行序列化 241
10.2.7 使用Madeleine进行对象的Prevalence 242
10.2.8 使用DBM库 243
10.3 使用KirbyBase 243
10.4 连接到外部数据库 246
10.4.1 连接到SQLite 246
10.4.2 连接到MySQL 247
10.4.3 连接到PostgreSQL 249
10.4.4 连接到LDAP 251
10.4.5 连接到Oracle 252
10.4.6 使用DBI封装类 253
10.4.7 对象关系映射器(Object-RelationalMapper,ORM) 254
10.5 结语 255
第11章 Ruby的OOP与动态特性 256
11.1 日常OOP任务 256
11.1.1 使用多个构造函数 257
11.1.2 创建实例属性 257
11.1.3 使用更精美的构造函数 258
11.1.4 创建类级属性和方法 259
11.1.5 继承超类 262
11.1.6 测试对象所属的类 264
11.1.7 判断对象的相等性 266
11.1.8 控制对方法的访问 267
11.1.9 复制对象 268
11.1.10 使用initialize_copy 269
11.1.11 理解allocate 270
11.1.12 处理模块 270
11.1.13 对象的变换或转换 273
11.1.14 创建只包含数据的类(Struct) 275
11.1.15 冻结对象 276
11.2 高级技巧 277
11.2.1 向对象发送显式消息 277
11.2.2 对象的特殊化 278
11.2.3 类和模块的嵌套 281
11.2.4 创建参数化类 282
11.2.5 使用继续来实现生成器 284
11.2.6 将代码存储为对象 286
11.2.7 模块包含的工作原理 287
11.2.8 检测默认参数 288
11.2.9 委托或转交 289
11.2.10 自动定义类级Reader与Writer 290
11.2.11 使用高级编程准则 291
11.3 使用动态特性 293
11.3.1 动态地执行代码 293
11.3.2 使用const get 294
11.3.3 根据名称动态地实例化类 294
11.3.4 获取和设置实例变量 295
11.3.5 使用define method 296
11.3.6 使用const_missing 298
11.3.7 删除定义 299
11.3.8 获取已定义的实体列表 301
11.3.9 查看调用栈 303
11.3.10 监视程序的执行 303
11.3.11 遍历对象空间 304
11.3.12 处理对不存在的方法的调用 305
11.3.13 跟踪类或对象定义的变更 305
11.3.14 定义对象的finalizer 308
11.4 结语 309
第12章 Ruby的图形界面 310
12.1 Ruby/Tk 310
12.1.1 概述 311
12.1.2 一个简单的窗口应用程序 312
12.1.3 使用按钮 313
12.1.4 使用文本框 315
12.1.5 使用其他窗口部件 318
12.1.6 其他说明 320
12.2 Ruby/GTK2 321
12.2.1 概述 321
12.2.2 一个简单的窗口应用程序 322
12.2.3 使用按钮 323
12.2.4 使用文本框 324
12.2.5 使用其他窗口部件 326
12.2.6 其他说明 329
12.3 FXRuby(FOX) 331
12.3.1 概述 331
12.3.2 一个简单的窗口应用程序 332
12.3.3 使用按钮 333
12.3.4 使用文本框 334
12.3.5 使用其他窗口部件 335
12.3.6 其他说明 342
12.4 QtRuby 342
12.4.1 概述 343
12.4.2 一个简单的窗口应用程序 343
12.4.3 使用按钮 344
12.4.4 使用文本框 345
12.4.5 使用其他窗口部件 346
12.4.6 其他说明 350
12.5 其他GUI工具包 351
12.5.1 Ruby和X 351
12.5.2 Ruby和wxWidgets 351
12.5.3 Apollo(Ruby和Delphi) 351
12.5.4Ruby与Windows API 352
12.6 结语 352
第13章 Ruby中的线程 353
13.1 创建和操控线程 353
13.1.1 创建线程 354
13.1.2 访问线程的局部变量 354
13.1.3 查询和修改线程状态 356
13.1.4 实现会合点并拦截返回值 358
13.1.5 处理异常 359
13.1.6 使用线程组 360
13.2 同步线程 361
13.2.1 使用临界区执行简单同步 362
13.2.2 同步对资源的访问(mutex.rb) 363
13.2.3 使用预定义的同步队列类 366
13.2.4 使用条件变量 367
13.2.5 使用其他同步技术 368
13.2.6 允许操作超时 370
13.2.7 等待事件发生 371
13.2.8 在I/O期间继续处理 372
13.2.9 实现并行迭代器 373
13.2.10 并行地递归删除 374
13.3 结语 375
第14章 脚本编程与系统管理 376
14.1 运行外部程序 376
14.1.1 使用system和exec 376
14.1.2 命令输出替换 377
14.1.3 操作进程 378
14.1.4 操作标准输入/输出 380
14.2 命令行选项和参数 380
14.2.1 命令行选项的解析 381
14.2.2 使用ARGF 382
14.2.3 使用ARGV 383
14.3 Shell库 383
14.3.1 使用Shell进行I/O重定向 383
14.3.2 有关shell.rb的其他说明 385
14.4 访问环境变量 385
14.4.1 获取和设置环境变量 386
14.4.2 将环境变量存储为数组或散列 386
14.4.3 将环境变量作为全局变量导入 387
14.5 Microsoft Windows脚本编程 387
14.5.1 使用Win32API 388
14.5.2 使用Win32OLE 388
14.5.3 使用ActiveScriptRuby 391
14.6 Windows One-Click安装程序 392
14.7 需要知道的库 393
14.8 使用文件、目录和树 393
14.8.1 文本过滤器简介 394
14.8.2 复制包含符号链接的目录树 394
14.8.3 根据创建日期或其他条件删除文件 395
14.8.4 确定可用磁盘空间 396
14.9 其他脚本编程任务 397
14.9.1 单文件Ruby解决方案 397
14.9.2 在Ruby解释器中使用管道 398
14.9.3 获取和设置退出编码 399
14.9.4 检测程序是否以交互方式运行 399
14.9.5 确定当前平台或操作系统 399
14.9.6 使用Etc模块 400
14.10 结语 400
第15章 Ruby和数据格式 401
15.1 使用REXML解析XML 401
15.1.1 树的解析 402
15.1.2 解析流 403
15.1.3 XPath及其他 404
15.2 使用RSS和Atom 405
15.2.1 rss标准库 405
15.2.2 feedtools库 407
15.3 使用RMagick操作图像数据 408
15.3.1 常见的图形任务 408
15.3.2 特效和变换 411
15.3.3 绘图API 414
15.4 使用PDF∷Writer创建PDF文档 416
15.4.1 基本概念和技巧 416
15.4.2 一个示例文档 418
15.5 结语 424
第16章 测试和调试 425
16.1 使用Test∷Unit进行测试 425
16.2 ZenTest工具 428
16.3 使用Ruby调试器 431
16.4 将irb用做调试器 434
16.5 度量代码覆盖率 435
16.6 度量性能 435
16.7 对象的完美输出(Prettyprinting) 439
16.8 结语 440
第17章 代码的打包和分发 441
17.1 使用RDoc 441
17.1.1 简单标记 443
17.1.2 高级格式化 445
17.2 安装和打包 445
17.2.1 setup.rb 446
17.2.2 RubyGem 447
17.3 RubyForge和RAA 448
17.4 结语 449
第18章 网络编程 450
18.1 网络服务器 451
18.1.1 一个简单服务器:时间 451
18.1.2 实现多线程服务器 453
18.1.3 案例分析:对等象棋服务器 453
18.2 网络客户端 459
18.2.1 从Web获取真正的随机数 459
18.2.2 连接到官方的时间服务器 462
18.2.3 与POP服务器交互 462
18.2.4 使用SMTP发送邮件 464
18.2.5 与IMAP服务器交互 466
18.2.6 附件的编码和解码 467
18.2.7 案例分析:邮件—新闻网关(Mail-News Gateway) 469
18.2.8 根据URL获取网页 473
18.2.9 使用Open-URI库 474
18.3 结语 474
第19章 Ruby与Web应用程序 475
19.1 使用Ruby进行CGI编程 475
19.1.1 cgi.rb库简介 476
19.1.2 显示和处理表单 477
19.1.3 使用Cookie 478
19.1.4 使用用户会话 478
19.2 使用FastCGI 479
19.3 Ruby on Rails 481
19.3.1 原理和技术 481
19.3.2 Rails应用程序的测试与调试 482
19.3.3 核心扩展 483
19.3.4 相关的工具和库 484
19.4 使用Nitro进行Web开发 484
19.4.1 创建基本的Nitro应用程序 484
19.4.2 Nitro和MVC模式 486
19.4.3 Nitro和Og 489
19.4.4 Nitro中常见的Web开发任务 490
19.4.5 其他重要的细节 492
19.5 Wee简介 494
19.5.1 一个简单的例子 494
19.5.2 将状态与URL关联起来 495
19.6 使用IOWA进行Web开发 496
19.6.1 基本的IOWA概念 496
19.6.2 IOWA中的模板 498
19.6.3 组件控制权转移 499
19.7 Ruby和Web服务器 500
19.7.1 使用mod ruby 500
19.7.2 使用erb 501
19.7.3 使用WEBrick 503
19.7.4 使用Mongrel 505
19.8 结语 506
第20章 分布式Ruby 507
20.1 概述:使用drb 507
20.2 案例分析:股票机模拟程序 509
20.3 Rinda:一种Ruby元组空间 512
20.4 分布式Ruby中的服务发现 515
20.5 结语 516
第21章 Ruby开发工具 517
21.1 使用RubyGems 517
21.2 使用rake 519
21.3 使用irb 521
21.4 ri工具 525
21.5 编辑器支持 526
21.6 集成开发环境 527
21.7 结语 528
第22章 Ruby社区 529
22.1 Web资源 529
22.2 新闻组和邮件列表 529
22.3 博客和在线杂志 530
22.4 Ruby修订请求 530
22.5 IRC频道 531
22.6 Ruby大会 531
22.7 本地的Ruby用户组 532
22.8 结语 532