标题：Ruby程序设计
概述
Ruby处在当前主流的位置上，并非“行家才知道，专业人员为导向的程序语言”。在学习Ruby的人群当中，应该有很多人是看了参考手册后，不知道要用Ruby 来做什么。本书并非以功能项目进行分类，而是以“想要做的事”作为主轴来进行分类，对于读者的学习绝对大有裨益。本书是在活用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.o rg各项服务的管理者，以及开发及维护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    在正则表达式“.”中匹配\n    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