Ruby程序设计
图书信息作者:【日】青木峰郎 后藤裕藏 高桥征义 著

【日】松本行弘 审校
博硕文化 译
出 版 社: 电子工业出版社
出版时间: 2009-6-1
页数:424页
开本:短16开
I S B N : 9787121088124
估价:59.00元
内 容 简 介Ruby是为了让程序设计更快乐而开发的程序语言。Ruby具有“彻底面向对象”、“丰富的程序库”、“亲和力高的直观语法形式”等多项特征,但这些特征并不是Ruby的目的,只能说是为了让程序设计更有趣而开发的手段罢了。
Ruby处在当前主流的位置上,并非“行家才知道,专业人员为导向的程序语言”。在学习Ruby的人群当中,应该有很多人是看了参考手册后,不知道要用Ruby 来做什么。本书并非以功能项目进行分类,而是以“想要做的事”作为主轴来进行分类,对于读者的学习绝对大有裨益。本书是在活用Ruby时不可离手的一本书,它能够帮助大家在程序设计的道路上获得更多的快乐。
希望本书的读者,都能从使用Ruby的过程中,找到属于自己的“兴趣”与“乐趣”。——若您可以这样灵活运用,那将是本书作者无上的荣幸了。
第二版审校者序
由2007年初往前回顾,我认为《Ruby程序设计》初版发行的2004年,对于Ruby来说是正值飞跃发展之际。同样是2004年所发表的Web Application Framework——Ruby on Rails、“15分钟建立一个Blog系统”的视频短片与“具有Java 10倍的生产力”的宣传口号,更是瞬时让Ruby在业界中备受瞩目。
我想也许是时间点恰恰好吧。Ruby真的很幸运。这个时代越来越要求单一程序设计师其个人的生产性,另一方面计算机运算能力有着飞跃性进步,可以容许“浪费”计算能力。在21世纪的今日,像上面这样的动态程序语言一直都是众人所需,而在满足这些需求的程序语言中,Ruby凭着Ruby on Rails的话题性,早一步到达这样的位置。此外,在Mac OS X上不仅仅将Ruby及Ruby on Rails当作标准的内建程序,也同时附加了控制OS的函数库,大有取得继Objective-C之后的开发程序语言地位的态势。
在现在Ruby与Ruby on Rails的周边环境,存在着“15分钟建立一个简单Blog系统,有什么意义”、“真的有Java 10倍的生产力吗?!”等想法单纯的问题。而这些问题实际上无论是真是假都好,重要的是“Ruby与Ruby on Rails就存在于当前,而且帮助程序设计师变得更快乐”这个事实。远在Ruby变得有名气之前开始,它就已经是一个对程序设计师很有用的工具了,而这一点从今以后我想应该也不会改变吧。
现在,Ruby并非“行家才知道,专业人员为导向的程序语言”,而是处在当前主流的位置上。在学习Ruby的人群当中,应该有很多人是看了参考手册后,不知道要用Ruby来做什么。本书并非以功能项目进行分类,而是以“想要做的事”作为主轴来进行分类,对于各位的学习绝对可以帮上不少忙。我个人认为,本书是在大家活用Ruby时不可离手的一本书。若Ruby与本书能够帮助大家在程序设计的道路上获得更多的快乐,我会感到十分欣慰。
2007年1月
于前往东京的班机上
松本行弘
初版审校者序在设计一种新的程序语言时,会有三件难事。第一是设计一个“好的”程序语言,再来就是一本入门书,最后就是如何使用这个语言方法的Recipe手册(或者Cookbook)。
对于Ruby来说,幸运的是第一件事已经解决了,但要克服接下来的事情就真的很不简单。入门书及Cookbook不论谁都希望能够出书,我们也企划了很多次,但始终“这本书”都没有出现。比起创造语言本身,我真的觉得执笔写出一本好书更加困难。
但是随着《Ruby Programming——向Ruby之父学程序设计》出版,第二项困难也被解决了,剩下的就是Cookbook。接着,《Ruby Programming——向Ruby之父学程序设计》的作者们得到了强力的援军——《Ruby原始码完全解说》的作者加入,终于完成了大家引颈期盼的《Ruby程序设计》。真的是可喜可贺!
这本书最重要的就是帮助那些跨过Ruby门槛的人,在解决实际问题上收集各式各样的诀窍方法。虽然本书分析了在使用Ruby过程中各式各样的情况,但绝不会钻入难以了解的解释之中,而是细心又详细地解说到程序的每个小角落。虽然本书刻意地回避了Ruby所有功能中部分高度复杂以及难解的部分,但熟练本书中的内容之后,我想也是可以快速地凌驾Ruby的中级者程度吧。在此之后,就应该可以以自身的能力向更高等级前进。
我由衷希望本书能够成为各位在Ruby程序设计上的良友。
Happy Hacking.
松本行弘
写在前面写了一个开源的程序并意外地被广泛使用这种事并不少。因工作关系写程序的不说,因自己的兴趣开始写程序,而刚好有机会被自己以外的人来使用。甚至,也常听到将程序发布到像Web一样许多人目光所及之处后,结果程序被远超过想象多的人来使用。
在刚开始写程序的时候,使用那个程序的用户,恐怕应该只有自己本身吧。起初因为学习等目的而开始写程序,在测试及确认可运作之后,就不会再被使用了。
像这样一个人来撰写程序,一个人使用,然后又丢掉的程序,使用怎样的撰写方式或许都无所谓。只要能够简单地写出来,能像预期的来运作就足够了。如果以料理来讲的话,一想到只有自己吃,就算食材已经超过保存期限,只要没有奇怪的味道就好了,或者是因为用盘子来装菜的话,要洗的盘子就变多,所以干脆吃炸面包就好了等,这样就会在不知不觉中越来越草率。就会想到“反正只跟我自己有关系,又不会影响到其他人”。
不过,一旦这些东西与其他人有交互时,就完全不同了。如果被某人招待的话,就会觉得不使用敬语是不行的。说到写程序也是一样的,用完就丢的一行指令与发布公开的脚本,写法一定会有所不同。
再者,写程序与做料理不同,会有许多人来进行,在未见过也未知的对方作品上来进行修改也不在少数。特别是以脚本语言写的程序,因为大多是以原始码的形式来流通,所以不论是谁都可以轻易地取得。因此,不单只是要让使用程序的人觉得好用,也要让写程序的人觉得好用,这样的程序才是我们所期待的。
总而言之,对我来说,追求的不只是写程序的快乐,而是要能够对写程序的人待若上宾。
当然,要达到这样的期望,不能只有想法,多样的程序语言知识也是必要的。这些知识包括了在某种程序语言中共同的知识,也包括只存在某个特定程序语言的特性。另外,也包括在许多情况下有用的技巧,以及在特定对象领域中不可欠缺的技巧。必须要熟悉各式各样的知识,然后加以使用。
再者,有时在待人的态度方法上也要多费心思。例如重新检阅算法、重新设计类别后进行测试、专注在方法名称及变量名称上等。这些工作大家或许都觉得很麻烦吧?不过,或许也正因为你花了这些工夫在程序上,而使得用户在使用时的愉悦更上一层楼也说不定。这是非常幸福的一件事。然后,一天天地积累这些工作,不正是成就你写出更好程序的基石吗?
* * *
在Perl等程序语言中,有一种称为“食谱(Cookbook)”的书。我们之前一直以写出这类书的Ruby版为目标开始执笔动工。不过或许实际上写出来的书其倾向会有点不同。把在Perl中的那类书当作教导读者做出满汉全席的话,我们写出来的这本书可能就是为普通人的基本家常菜而已,在程度上多少有些差异。不过,我们的目标是让这本书成为不输给那类书,而对读者能有很大帮助的一本书。
我想在这本书中你一定可以找到一些你所不知道的菜谱。而如果这些菜谱可以帮助你写出一个善待用户的程序的话,身为作者的我们就得到最大的喜悦了。
如果这本书能迎合您的口味的话,我们真的感到非常荣幸。
作者群
初版致谢紧接着在《Ruby Programming——向Ruby之父学程序设计》之后,本书也得到许多人的帮助而能顺利到了出版的阶段。
最要感谢的人就是SoftBank出版社第一书籍编辑部的杉山先生。如果没有他坚强的耐心以及长时间跟进的话,本书绝对无法到达出版阶段。真的是非常感谢。
接下来要感谢的是Ruby的亲生父亲、给予我们审校帮助的松本行弘先生,以及帮我们审阅的Nakamura、Nahi、Yamda Akira、Watanaba Hirofumi,以及安藤叶子小姐、沓名亮典先生、后藤谦太郎先生、西山和广先生、一步先生以及其他我们在本书中所使用函数库的开发者等,还有在Ruby的各Mailing List及IRC中提供各种有用以及有趣信息的社群朋友,还有ruby-lang.org各项服务的管理者,以及开发及维护Ruby的相关人员们,我们在此由衷向你们表示感谢。真的非常感谢你们的帮助。
还有,本书原本只预定由《Ruby Programming——向Ruby之父学程序设计》的两位作者后藤以及高桥先生来执笔,不过在苦战的结尾,我们向青木先生寻求支持,而形成三人的团队。在最终的原稿执笔上,青木先生的贡献是最大的。虽然是作者群中的一人,也不能说得上是致谢,但在此还是要记下本书能顺利发行的经过。
关于本书
本书的对象及其操作环境
本书主要的对象为
对于Ruby的概要已经了解的读者
虽然不懂Ruby,但已经学过其他程序语言的读者
而对于那些第一次接触程序设计以及Ruby的人来说,我们并不推荐您阅读此书。不过我们推荐您阅读本书的姊妹篇——《Ruby Programming——向Ruby之父学程序设计》。
另外,本书的操作环境为Ruby 1.6.7版至1.8.5版。其中我们会特别将重点放在1.8.5版上。
部分与版本有关会造成不同结果的程序代码,我们会在该项技巧的“说明”部分补充有关版本间兼容性的问题。
在操作系统环境部分,工作平台可以是Windows及各种UNIX。特别与工作环境有关的脚本,请各位读者确认是否为以下的操作系统。
Windows XP SP2 / mswin32版Ruby(i686)
Windows XP SP2 / Cygwin版Ruby(i686)
Windows 2000 SP4 / mswin32版Ruby(i686)
Windows 2000 SP4 / Cygwin版Ruby(i686)
Debian 3.1(Linux 2.6 / AMD64)
Debian 3.1(Linux 2.6 / i686)
Solaris 9(SPARC 32bit)
Tru64UNIX 5.1B(Alpha)
各个技巧(Recipe),可由 、 的标示来知道该技巧是否可在Windows或UNIX环境下使用。
给使用Windows的使用者
可以在Windows下执行的Ruby程序有许多种,其中以Cygwin版与UNIX的操作最为相近,所以这个版本是包含在 标示中,而不是 标示。
正文中的表示方式
程序的输出
书中程序的输出内容会以“输出方法的侧边,或者在次行加上 #=> ,然后其右侧为输出结果”的方式来表示,如:
# 以p方法来显示"Hello, Ruby."
p "Hello, Ruby." #=> "Hello, Ruby."
这种方式在Ruby的使用手册中经常使用。
实例方法与类别方法
本书在方法的表示方式上也是采用在Ruby使用手册中常用的表示方式。
实例方法使用“类别名称#方法名称”来表示。例如String类别的实例方法length,本书中会以String#length来表示。这种表示方式是在文件或者说明中使用的,若在程序中使用的话,则会发生错误,请读者要特别注意。
类别方法在本书中会以“类别名称.方法名称”来表示。例如Array类别的类别方法new,在本书中会以Array.new来表示。这种表示方法与实际在程序中的表示方法是相同的。
目 录第1章 Ruby的语法
001 常值(literal) 2
002 运算符 6
003 变量与常数 9
004 代入 11
005 程序语句的分段 12
006 备注 13
007 真假值与条件判断 14
008 循环 17
009 调用方法 19
010 区块(block) 20
011 方法(Method)定义 21
012 限制方法的调用 22
013 类别(Class)定义 23
014 模块(Module)定义 24
015 特殊方法 25
016 例外处理 26
017 alias与undef 27
018 保留字 28
第2章 字符串
019 选择适当的字符串常值 30
020 设置默认的文字编码 32
021 变换文字编码 34
022 推测文字编码 37
023 复制字符串 39
024 重复字符串 40
025 取得字符串长度 41
026 查找字符串 42
027 查询正则表达式是否匹配字符串的开头/结尾 45
028 匹配单字 46
029 以特定的文字编码来进行正则表达式匹配 48
030 在正则表达式“.”中匹配
50
031 从上次匹配的部分开始继续匹配 51
032 计算特定的文字、字符串出现的次数 53
033 计算字符的出现频率 55
034 比较字符串 56
035 对空白进行匹配 57
036 判断字符串是否为空行 58
037 判断是否为表示数值的字符串 59
038 将字符串变换为数值 60
039 判断字符为大写或小写 62
040 将字母变换为大写/小写 63
041 取出字符串的一部分 65
042 取出正则表达式匹配的部分 67
043 取出正则表达式匹配部分的前后字符串 69
044 查询包含特定文字部分的长度 70
045 将字符串分割为段落 71
046 将字符串分割为行 73
047 将字符串分割为单字 74
048 以正则表达式来分割字符串 76
049 处理字符串的个别文字 78
050 处理字符串的单一字节 79
051 链接字符串 80
052 置换字符串的一部分内容 81
053 跳脱字符/除去跳脱字符 83
054 除去字符串的一部分 85
055 取出行尾的换行字符 87
056 除去字符串开头/结尾的空白 89
057 变换Tab与半角空格符 91
058 变更缩排 92
059 将Here Document缩排后编写 94
060 在字符串结尾加上字符串 95
061 对字符串的一部分进行破坏性删除 97
062 在字符串中间破坏性地插入字符串 99
063 字符与字符编码相互变换 101
064 将字符串依n个文字来分割 103
065 将字符串切出最大n字节的部分字符串 104
066 将字符串切出最大n个文字的部分字符串 106
067 将字符串切出最大n位的部分字符串 107
068 以特定文字来隐藏部分字符串 108
069 建立信息摘要(Message Digest) 109
070 判断字符串是否可作为正确的正则表达式 111
071 跳脱正则表达式的Meta文字 112
072 判断字符串是否同时与多个正则表达式匹配 113
073 分割正则表达式来记述 114
074 正则表达式集 116
075 将字符串整形为各段落 118
076 解析各种文字格式 119
077 处理以“,”来分隔的数据(CSV) 122
078 解析XML 124
079 解析YAML 127
080 处理HTML 129
081 自动补完单字 132
082 判断是否为有效的E-mail地址 134
第3章 数组(Array)与哈希(Hash)
083 建立数组 136
084 复制数组 138
085 建立多维数组 139
086 依序处理数组及哈希的所有元素 140
087 并行处理多个数组 141
088 多维数组的循环 143
089 取得数组的元素 144
090 改变数组的元素 146
091 删除数组的元素 147
092 在数组的开头/结尾加入元素 148
093 取出并除去数组开头/结尾的元素 149
094 置换数组的元素 150
095 随机取得数组中的元素 151
096 随机排列数组中的元素 152
097 查询数组的元素个数 153
098 查询数组中元素的出现次数 154
099 从数组中一次取出多个元素 155
100 取得数组中索引与元素的配对组 156
101 将数组中元素填入相同的值 157
102 由数组中取出并除去重复的元素 158
103 取得数组中满足条件的元素 159
104 查找数组的元素 160
105 比较两个数组 161
106 找出两个数组中相同的元素 162
107 取出两个数组间的差 163
108 连接数组 164
109 将数组中元素的顺序反转 165
110 将一定范围的整数作为数组的元素 166
111 将数组作为(以“,”)连接的字符串 167
112 二元查找法 168
113 建立哈希的键值类别 169
114 在哈希中加入元素 170
115 查询哈希内键值是否存在 171
116 删除哈希的元素 172
117 显示哈希的内容 173
118 将哈希元素以插入顺序取出 174
119 建立单一键可对应多值的哈希 176
120 交替哈希的键与值 177
121 排序数组及哈希 178
122 合并哈希 180
123 找出两个哈希中都有的键/只有一个哈希才有的键 181
124 设置默认值 182
125 使用巨大的离散数组 183
126 建立具有Collection特性的类别 184
127 使用堆栈与队列 185
第4章 文件与目录
128 将文件名分割为其组成元素 188
129 从相对路径求出绝对路径 189
130 判断路径名是否吻合样式(Pattern) 190
131 取得目录与文件一览 192
132 取得目前所在的目录名称 194
133 变更当前目录 195
134 求得执行脚本所处的路径 196
135 更改文件名 197
136 复制文件 198
137 删除文件 200
138 判断文件是否可读取、可写入 201
139 判断文件是否存在/判断其种类 202
140 取得文件属性 203
141 变更文件属性 205
142 建立链接 207
143 判断两个文件是否相同 209
144 建立目录 211
145 对目录内的所有文件进行递归处理 212
146 递归复制目录 213
147 删除目录 214
148 事先确认文件操作 215
149 新增名称不重复的文件 216
第5章 输入/输出
150 打开文件 219
151 以行为单位来处理文件 220
152 读取文件内容 222
153 建立新的文件 224
154 在文件末尾加入数据 226
155 以单行指令(One-liner)更新文件 227
156 使输出操作与文件更新同步 228
157 计算文件的行数 229
158 将文件由文件末尾开始处理至行单位中 230
159 读取正在写入的文件 232
160 建立暂存文件 233
161 锁定文件 234
162 将文件转为十六进制 235
163 在文件中插入一行 236
164 以二进制模式写入文件 238
165 处理固定长度的记录 239
166 切割文件大小 241
167 删除文件开头的n行 242
168 删除文件末尾的n行 243
169 将标准输入/输出接替至文件 245
170 复制I/O对象 246
171 以printf来格式化输出 248
第6章 数值
172 格式化数值 251
173 位运算 253
174 在二进制、八进制、十进制、十六进制间相互转换 254
175 将数值每三位以“,”区隔开来 255
176 指定次数并重复处理 256
177 求解最大值、最小值 257
178 求解数值的总和 258
179 求绝对值 259
180 求除法的余数 260
181 求解指数 262
182 求最大公因数及最小公倍数 263
183 求解平方根 264
184 计算三角函数 265
185 将直角坐标系转换为极坐标系 266
186 进行对数计算 267
187 对浮点数进行四舍五入等处理 268
188 比较浮点数 270
189 取得随机数 271
190 使用矩阵 272
191 使用复数 274
192 使用有理数 275
第7章 日期与时间
193 查询现在的日期与时间 277
194 由日期时间中取出月份、星期几等 279
195 日期时间与Epoch秒相互转换 280
196 求两个日期时间的差 282
197 格式化日期时间 283
198 将字符串转换为日期时间 285
199 求出由1月1日起到目前所经过的天数 286
200 判断闰年 287
201 求出一个月最后一天的日期 288
202 判断是否为假日 289
203 求出“本月第三个星期一”的日期 290
第8章 环境相关
204 将Ruby脚本做成一般指令 292
205 暂时性地在做成指令的Ruby脚本上加入选项后执行 295
206 取得命令行的参数 296
207 解析命令行选项 298
208 存取环境变量 301
209 让脚本作为指令或者函数库都可以执行 302
210 控制Ruby的函数库加载器(Library Loader) 303
211 对Ruby脚本进行除错 304
212 取得用户及群组相关信息 307
213 切换使用者ID、群组ID 310
214 存取Windows登录文件(Registry) 312
215 调用系统函数库的函数 313
第9章 程序间通信
216 暂时停止脚本 317
217 测量脚本的运行时间 318
218 启动指令 320
219 产生子程序(fork) 322
220 设置信号处理器(Signal Handler) 323
221 Deamo 324
222 控制Windows的应用程序 325
223 取得本机名称 327
224 变换机器名称以及IP位置 328
225 建立TCP客户端 329
226 制作一个TCP服务器 330
227 建立HTTP客户端 332
228 存取其他程序的Ruby对象 334
第10章 CGI
229 由窗体中取出输入值 337
230 取出Query字符串 338
231 使用Session 339
232 处理Cookie 341
233 参照Meta变量 343
234 输出HTML头文件 344
235 对URL进行编码/反编码 345
236 跳脱/不跳脱HTML 346
237 使用污染模式(taint mode) 347
238 预防XSS(Cross Site Scripting) 349
239 在HTML中嵌入Ruby脚本 351
240 上传文件 352
第11章 对象
241 判断对象是否相同 354
242 复制对象 356
243 查询对象的类别 357
244 将对象转换为字符串 359
245 将对象转换为数值 360
246 将对象转换为数组 362
247 将对象存储在文件中 363
248 多重继承 365
249 委托方法 366
250 委托区块 368
251 建立可作为String或Array来操作的类别 369
252 使用无名函数 371
253 多载方法 372
254 使用关键词参数 374
255 定义模块函数 375
256 定义类别方法的别名 376
257 将实例变量依各个类别来设为private 377
258 查询方法是否存在于对象中 379
259 取得对象中定义的方法列表 381
260 保有兼容性并改变方法名 383
261 保有兼容性并改变参数的个数 384
262 保有兼容性并加上/移除区块 386
263 保持兼容性并更改类别名 387
264 保有兼容性并更改函数库名 388
265 在旧版Ruby中使用新版Ruby的方法 389
266 将文件当作Ruby脚本来载入 390
267 将字符串当作Ruby脚本来执行 391
268 替代脚本文件名/行编号 392
附录A
A01 Web上的资源 394
A02 指令列选项 395
A03 Ruby参考的环境变量 397
A04 Ruby标准类别及函数库 398
A05 printf格式化字符串 401
A06 pack模板字符串 403