RubyProgramming:向Ruby之父学程序设计pdf

下载地址:网盘下载

内 容 简 介

编辑

Ruby是为了让程序设计更快乐而开发的程序语言。Ruby具有“彻底面向对象”、“丰富的程序库”、“亲和力高的直观语法形式”等多项特征,但这些特征并不是Ruby的目的,只能说是为了让程序设计更有趣而开发的手段罢了。

希望本书的读者,都能从使用Ruby的过程中,找到属于自己的“兴趣”与“乐趣”。──若您可以这样灵活运用,那将是本书作者无上的荣幸了。

审校者序

编辑

正如本书的著者高桥征义和后藤裕藏先生是在意想之外接过此书的改版任务一样,我也是非常意外地接到本书的中文版的审校任务。通过对本书日文版和繁体版的通读以及动手作业对本书的程序代码进行验证、对文字进行校对,我要讲的是,本书的确是Ruby书籍中的上乘之作,非常适合初学者,对于有一定经验的Ruby程序员,此书中的真知灼见一样会使你收益无穷。

为什么要这样说呢?首先我们看看国内原创的出版物,含混晦涩者比比皆是。而此书的作者在行文取材方面,非常符合初学者的认知规律,该简单的地方简单,该详述的地方详细,并赋予生动的例子和解说,循序渐进地将读者引入一个更高的理解层次。在使用此书时,你无须咬文嚼字,也不会出现味如嚼蜡、一头雾水的感受。相反地,在通读本书的同时,你所感受到的是一种不满足,但又极为兴奋的成就感。于是,你不得不佩服著者本人的文字功底水平,以及其对读者心理的极度揣摩。此外,对照日文版,著者行文的每一句话都经过仔细地斟酌,在这一点上你不得不佩服日本人的认真。唉,凡事只怕认真!在国内很多的原创出版物身上,“认真”两字,恐怕是水中的月亮——可望不可及。

那成书的质量如何呢?本书的日文版审校者,Ruby的创始人松本行弘给本书非常高的评价,认为这是一本能够让读者快乐学习Ruby,能够为读者“开启Ruby程序设计大门”的一本高质量的图书。

翻译质量怎么样呢?本书传承于繁体版,并注意到了中国大陆和台湾在专业术语方面的差异,因而比较适合大陆读者阅读。此外,本书语言比较口语化,显得生动、简单,读起来完全没有含混晦涩的感觉。就翻译质量这一点来说,最简单的举证从繁体版在台湾的销售行情和读者们的褒奖上就可以看出来,本书是一本高质量的图书。

由于Ruby是日本人所发明,本书中涉及了一些在日本专用的程序设计内容,如邮政编码、日文编码等,读者可以自行取舍。

最后,祝读者们在通读本书时学有所成。

张 华

2008年9月9日

第二版审订者序

看着电视里的足球选手踢球赛,感觉似乎没有这么困难。这些选手们无论是运球还是射门都看似轻而易举,但在我们所看不见的背后,绝对是经过日以继夜的锻炼,像我们这种外行人员如果混进这些选手里,不要说尽情踢球了,能不能碰到球都很有问题。就好像是看似优雅地浮在水面上的天鹅,其实水面下的双脚无时无刻地都在拼命地划着水,这个世界上,充满了各式各样表面上所无法看见的努力。

或许程序设计也是这样。有经验的程序设计师,就好像是念着咒语一样对电脑输入程序码,就看似能够自由操作电脑。而且,这种人嘴边一定挂着“写程序很快乐喔!”之类的话语。但对没有程序经验的人来说,程序设计和魔术就好比是亲戚一样,电脑就像是魔法箱,但总是没办法自由自在地操纵。

但仔细一想,这些有经验的程序设计师也都是一般人,而电脑只不过是工具而已。有些人能感觉到“很快乐”,但也有人感到无比痛苦,这背后一定隐藏着什么秘密。

本书的主题是程序语言Ruby,它就是其中一项秘密。Ruby语言里蕴藏着让写程序更轻松的各种秘密,是我这个熟练的程序设计师所开发出来的——“想尽办法让自己写程序更轻松”的程序语言。使用Ruby,能够更容易让电脑听话。

本书是学习Ruby语言的助手。本书的初版是一本颇受各界好评的入门书籍,四年后出版这本第二版,配合Ruby本身的版本从1.6提升到1.8,修订了相关内容。第二版不只保留了原来浅显易懂的说明,更追随Ruby的新版本补充了相关的介绍。

相信本书能帮助读者的程序设计技术水平比现在连跳一到两级,充分发挥Ruby的功力!

Enjoy Programming!

松本行弘

2006年7月

初版审订者序

编辑

体会使用者的感受,才能做出好作品。至少,我了解Ruby的使用者,也就是程序设计师的感受,所以能设计出反映程序设计师感受的程序语言。当然,我自己就是Ruby的使用者之一,所以这里所说的程序设计师的感受,说穿了就是坦率面对自己的欲望需求。相信“遵循‘自然’的法则,不去违逆使用者的感受”,就是Ruby成功的关键之一。

从这个角度来说,要写一本适合初学者的好书,或许是世界上最难的一件事。

要写一本给初学者看的书,首先作者必须广泛熟悉要说明的主题。对于进阶的使用者,可能很容易抓到感觉到的东西;但对初学者来说,就无法天真地这样期待。对初学者来说,很多可能会卡住的地方,最好都能有详细的说明。但是,初学者的基础知识也不够,所以书写得越详细,反而会变成更有压力的一本书。

另外,若不知道初学者的想法、初学者抱有什么疑问、初学者会在哪里卡住,也无法写出适合初学者的好书。拥有知识足以撰写初学者所用书籍的人,都不会是初学者,也因为自己已经不是初学者了,往往也都忘记自己身为初学者时的感受。总之,写本适合初学者的书,需要上面所述的平衡点(译者注:详细与初学者基础知识之间),更仔细地体会使用者的感受才行。

想到市面上充斥着一堆标榜着“入门”但完全称不上是入门的书籍,就能更加印证上面说的这些难点。

不过,本书不会违逆初学者的感受。本书放弃了一堆艰涩的用词,并在该强调的地方都适时地强调出来。或许可以说是借鉴了XP(不是某公司的操作系统,是指“极限编程(eXtreme Programming)”)手法的“极限描述(eXtreme Writing)”写出来的书吧!呵,真是名不虚传!

相信本书能成为读者开启Ruby程序设计大门的第一本书。

Enjoy Programming!

松本行弘

写在前面——程序设计可以是“兴趣”

“狄!你会觉得那种东西有趣吗?”

“很有趣啊!如果狮子跟长颈鹿生在热带草原,就没有这种乐趣了!”

——三原顺《我坐下的地方》

与电脑程序相处的方式有两种:一种是“使用程序”;另一种则是“制作程序”。

但是,制作程序的人并不是那么多,大部分的人都只是使用程序。比例上或许和“阅读文章的人”与“写文章的人”很相似。虽然小说、散文、札记随笔的读者有很多,但自己在写小说、写随笔的人与读者相比,就少得多了。

但“文章”不限于商业出版作品。例如“自己的网页”该怎么算呢?有很多人每天更新自己的网页,里面可能写一些笑话取悦周围的朋友,或者提供有用的信息让人参考。虽然可能只是微不足道的东西,但既然有期待网页更新的读者,也就是“使用者”存在,也可以看做是“让人阅读的文章”吧。

制作这种网站的目的可能也五花八门。但无论如何,想必一定有相当多数的这些网页内容制作者,自己也觉得写这些东西很有趣。尤其是个人网站,通常就是为了满足自己的兴趣而制作的吧。

程序设计是否也相同呢?也就是说,不是只为了达成什么目的而写程序,而是因为就陶醉在写程序这件事本身上。

不过,除了程序的内容以外,相信使用什么程序语言也会在相当程度上左右快乐的感觉。是否有什么程序语言是适合拿来玩乐的呢?

——有。至少有一个,那就是Ruby。

* * *

Ruby是为了让程序设计更快乐而开发的程序语言。Ruby具有“彻底面向对象”、“丰富的程序库”、“亲和力高的直观语法形式”等多项特征,但这些特征并不是Ruby的目的。顶多只能说是为了让程序设计更有趣而开发的手段罢了。

在程序设计的世界里,直到现在已经有各式各样的程序语言出现并持续使用着。这些语言的开发往往有其目的,例如“写出能够高速运作的程序”、“可以在短时期内学会写程序”、“写一次到处运行”、“小朋友也能轻易写出程序”等。但是积极主张“让写程序更快乐”的程序语言,似乎就不太常见了。或许是没有人积极地去思考过“人人都来进行程序设计”这个议题吧。

当然,“让程序设计更快乐的程序语言”,一定要简单好用才行。因为麻烦的程序语言就很难让人感受到“快乐”了。同时,功能也要非常强大才行。使用无力的语言写程序是很辛苦的。所以不用说,Ruby是个用起来很简单又很强大的程序语言。

* * *

本书为了让那些完全没有程序设计经验的读者也能灵活地使用Ruby,因此书中详细地说明了各种知识。从程序所需要的变量、常数、方法、类、控制结构等语法的说明,到类的主要使用方法、简单的应用等,尽可能都浅显地加以解说。或许对完全没碰过电脑的读者还是有点吃力,但若您是自己动手玩过HTML这样的读者,应该就能充分活用本书的知识了。另外,若您不是初学者,但想要从头开始学习Ruby语言,这本书也会派上用场。

希望本书的读者,都能从使用Ruby的过程中,找到属于自己的“兴趣”与“乐趣”。——若您可以这样灵活运用,那将是是笔者无上的荣幸了。

欢迎光临Ruby的世界!

高桥征义|后藤裕藏

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">

前 言

编辑

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">

0.1 关于Ruby

在开始写程序之前,先来介绍一些Ruby的基础知识吧。

? Ruby是脚本语言

要执行C、Java这些程序语言所开发的程序,必须运行将程序的源码翻译成机器指令的“编译(Compile)”程序。“脚本语言”的“脚本(Script)”(译者注)这个词常常与“程序(Program)”一词混着用,但要注意的是,执行用脚本语言所写的程序时,一般来说都不需要经过编译动作。

Script译为指令码、脚本、描述、草稿等。也就是说,使用脚本语言的话,原本“写程序→编译→执行”的流程,可以简化成“写程序→执行”。所以比起需要编译的程序而言,写程序的步骤会轻松一些。

? Ruby是面向对象语言

Ruby是一个爱好面向对象的程序设计师某天发誓要设计出最完美的面向对象程序语言后所制造出来的产物。所有数据都一贯使用对象的形式表达,所以可以将自己的想法直接写进程序里。当然也具备了继承、Mix-in等各种面向对象的功能。

另外,Ruby除了具有各种标准程序库外,还加上了例外(Exception)的错误处理机制、自动释放内存的垃圾回收等各种让程序设计更舒服的机制。

? Ruby是跨平台的语言

Ruby在MacOS X、Linux、FreeBSD、Solaris、HP-UX等UNIX类操作系统,以及Windows环境等各种平台上都可以运作。大部分的Ruby脚本都不需要经过任何改写就可以在其他平台上直接执行。

? Ruby是开放源码软件

Ruby是松本行弘(Yukihiro Matsumoto/简称Matz)先生所开发的开放源码软件(自由软件),任何人都可以自由取得Ruby并使用它。自从Ruby在1995年公布于互联网上起,已经获得很多用户的支持,现在仍活跃地持续开发着。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">

0.2 读者对象

本书是为有电脑操作知识,但没有程序设计经验的人而编写的Ruby程序设计入门书。虽然在执笔时已经尽可能力求不需要读者具备太多预备知识就能阅读,但“电脑的开机与关机”、“Shift键的用法”等,这些电脑基础知识还是省略掉了。本书所预计的读者大致如下:

? 对于文件操作、执行指令有基本的认识。

? 能够使用文字编辑器制作纯文本文件。

? 想要学会写程序。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">

0.3 关于本书的结构

虽然本书各章已经排列成适合从头开始依序阅读,但对于有一点点Ruby经验的人来说,从头开始学习前面部分可能会感到烦闷。若您对Ruby的语法已经有初步的了解,可以直接跳过第一、二部分,直接从第三部分开始学习。

? 第一部分 开始使用Ruby

通过简单的Ruby程序来介绍程序的基本架构。

? 第二部分 学习基础

写Ruby程序时需要知道的基础语法规则,以及类、模块等面向对象程序设计的思考方法与用词。

? 第三部分 使用类

写程序时重要的不只是语法。使用Ruby之所以能够快乐地写程序,在相当程度上是因为它提供了设计精巧的标准程序库。

在这里就对一些基础类逐一介绍其功能与用法。

? 第四部分 灵活使用Ruby

为了能灵活使用Ruby,这里要介绍一些比较高级的功能。比如Ruby的环境参数、环境变量、迭代器的用法与做法、Mix-in等在第二、三部分没有提到的内容。

? 第五部分 制作应用

在这里作为整本书内容的综合,介绍比较复杂一点的程序范例。试着使用Ruby来写出比较实用的程序。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">

? 附录

编辑

使用Ruby时所需的知识、相关的资讯等,都整理在附录里。也介绍了Ruby的mailing-list、网络上的各种资源与其用法。

安装Ruby的方法也写在这里,请在阅读本书之前先在您的电脑上构建好可以使用Ruby的环境吧。

0.4 执行环境

本书的程序码是在版本1.8.4的Ruby上开发的。笔者假设读者是在Windows XP/2000、MacOS X,以及一般的UNIX操作系统上执行的。关于Ruby的安装方法,请参见附录A中的“A.1 安装Ruby”。在开始阅读本书前,请配置好Ruby运行环境。

谢 辞

与很多图书的出版一样,本书在得到多方的协助后方得以出版。

对本书进行审校的松本行宏先生,给予(我)撰写本书机会的渡边哲也先生,因为本书原稿的延误而对其导致不便的软银(Softbank)创新会社的第一书籍编辑部的杉山聪先生、叶山响先生,对各种发布的Ruby指南做出贡献以及对各种文档进行整理准备的Ruby List ML的诸位,在RRA中发布各种程序和文档的作者们,对Ruby网站进行维护和运营的Webmaster们,在Ruby的各种ML中提供有益信息、活动话题的诸位,对作者本人多方照顾的加藤希女士,还有Ruby的创始人松本行宏先生以及很多的开发者们,在此致以衷心的谢意,非常地谢谢你们。

还有,在第2版中,双花社(Twin Spark)会社的程序员们对原稿进行了检查,故而在此也深表谢意。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">

目 录

编辑

第1部分 开始使用Ruby

第1章 与Ruby的第一次接触 2

1.1 执行Ruby 2

1.1.1 Windows环境 3

1.1.2 UNIX环境 4

1.1.3 MacOS X环境 4

1.1.4 确认执行正常 5

1.2 程序的说明 5

1.2.1 对象 5

1.2.2 方法 5

1.3 字符串 6

1.3.1 换行字符与“\” 6

1.3.2 “‘‘”与“""” 6

1.4 调用方法 7

1.5 puts方法 7

1.6 p方法 8

1.7 显示中文 8

1.8 数值的显示与计算 9

1.8.1 显示数值 9

1.8.2 四则运算 10

1.8.3 数学函数 10

1.9 变量 11

1.10 写注释 12

1.11 控制结构 13

1.12 条件判断:if~then~end 14

1.13 字符串反复执行(循环) 15

1.13.1 while语句 15

1.13.2 times方法 15

1.14 定义方法 16

1.15 读入其他文件 16

第2章 方便的对象 18

2.1 数组 19

2.1.1 建立数组 19

2.1.2 从数组中取得对象 19

2.1.3 将对象存进数组里 20

2.1.4 数组的内容 20

2.1.5 数组的大小 21

2.1.6 逐项处理数组内容 21

2.2 杂凑(HASH) 22

2.2.1 建立杂凑 22

2.2.2 从杂凑获取对象 22

2.2.3 逐项处理杂凑内容 23

2.3 正则表达式 24

第3章 指令设计 27

3.1 从命令行输入的数据 27

3.2 读取文件 28

3.2.1 读入文件内的文本数据并显示 28

3.2.2 从文件逐行读入数据并显示出来 29

3.2.3 只显示文件里符合特定样式的几行 30

第2部分 学习基础

第4章 对象与变量、常数 34

4.1 对象 34

4.2 类 35

4.3 变量 35

4.4 常数 37

4.5 保留字 37

第5章 条件判断 42

5.1 什么是条件判断 42

5.2 Ruby的条件 43

5.2.1 条件与真假值 43

5.2.2 逻辑运算符 43

5.3 if语句 44

5.4 unless语句 46

5.5 case语句 47

5.6 if修饰符与unless修饰符 49

5.7 总结 50

第6章 循环 51

6.1 循环的基础 51

6.2 写循环时要注意的事情 51

6.3 实现循环的方式 52

6.4 times方法 52

6.5 for语句 53

6.6 一般的for语句 55

6.7 while语句 55

6.8 until语句 57

6.9 each方法 58

6.10 loop方法 59

6.11 循环的控制 59

6.11.1 break 60

6.11.2 next 61

6.11.3 redo 62

6.12 总结 63

第7章 方法 64

7.1 调用方法 64

7.2 方法的分类 64

7.2.1 实例方法 64

7.2.2 类方法 65

7.2.3 函数性的方法 65

7.3 定义方法 66

第8章 类与模块 68

8.1 什么是类 68

8.1.1 类与实例 68

8.1.2 继承 69

8.2 自己定义类 70

8.2.1 class语句 70

8.2.2 initialize方法 71

8.2.3 实例变量与实例方法 71

8.2.4 访问方法 72

8.2.5 类方法 73

8.2.6 常数 74

8.2.7 类变量 74

8.2.8 扩充类 74

8.2.9 使用继承 75

8.2.10 限制方法的调用 76

8.3 什么是面向对象 78

8.3.1 数据与处理程序 78

8.3.2 “数据与处理程序”方式的问题 79

8.3.3 对象 80

8.3.4 面向对象的特征 81

8.3.5 Duck Typing(行为决定类型) 82

8.4 什么是模块 83

8.5 自己定义模块 84

8.5.1 常数 85

8.5.2 定义方法 85

第9章 错误处理与例外 86

9.1 关于错误处理 86

9.2 例外处理 87

9.3 例外处理的写法 88

9.4 善后处理 90

9.5 重新执行 90

9.6 rescue修饰符 91

9.7 例外处理语法的补充 91

9.8 指定要捕捉的例外 92

9.9 例外类 92

9.10 引发例外 93

9.11 catch与throw 94

第3部分 使用类

第10章 数值(Numeric)类 96

10.1 Numeric的类架构 96

10.2 数值常数 97

10.3 算术运算 97

10.3.1 除法 98

10.3.2 Math模块 99

10.4 数值类型的转换 99

10.5 位运算 100

10.6 数数 102

练习 103

第11章 数组(Array)类 104

11.1 复习数组 104

11.2 建立数组 105

11.2.1 使用Array.new 105

11.2.2 使用%w 105

11.2.3 使用to_a方法 106

11.2.4 使用字符串的split方法 106

11.3 索引的用法 106

11.3.1 获取元素 106

11.3.2 改写元素 108

11.3.3 插入元素 109

11.3.4 以多个索引建立新数组 109

11.4 不使用索引操作数组 109

11.5 作为集合的数组 110

11.6 作为“列表”的数组 111

11.7 数组的主要方法 113

11.7.1 将数据加入数组中 113

11.7.2 从数组中删除数据 114

11.7.3 换掉数组的元素 115

11.8 数组与迭代器 117

11.9 处理数组的每个元素 117

11.9.1 使用循环配合索引 117

11.9.2 使用each方法逐项获取元素 118

11.9.3 使用破坏性的方法反复操作 118

11.9.4 使用其他迭代器 118

11.9.5 自己设计迭代器 118

11.10 数组的元素 119

11.10.1 示例:使用简单的矩阵 119

11.10.2 小心初始化 119

11.11 并行处理多个数组的值 120

练习 121

第12章 字符串(String)类 122

12.1 建立字符串 122

12.1.1 使用%Q、%q 123

12.1.2 使用嵌入文档 123

12.1.3 使用sprintf方法 124

12.2 获取字符串长度 125

12.3 分割字符串 126

12.4 连接字符串 127

12.5 字符串的索引 128

12.6 比较字符串 129

12.7 处理换行字符 131

12.8 字符串的查找与取代 131

12.8.1 查找字符串 132

12.8.2 字符串的取代 132

12.9 字符串与数组共同的方法 133

12.9.1 与索引操作有关的方法 133

12.9.2 Enumerable模块相关的方法 133

12.9.3 连接、逆转相关的方法 134

12.10 其他方法 134

练习 137

第13章 杂凑(Hash)类 139

13.1 杂凑的复习 139

13.2 建立杂凑的方法 140

13.2.1 使用{} 140

13.2.2 使用Hash.new 140

13.3 获取、设定杂凑的值 140

13.3.1 直接取出所有键或值 141

13.3.2 杂凑的默认值 141

13.4 查询杂凑里是否存在某个键或值 142

13.5 查询杂凑的大小 143

13.6 删除键与值 143

13.7 初始化杂凑 144

13.8 应用示例:计算单字数量 145

练习 147

第14章 正则表达式

第14章 (Regexp)类 148

14.1 关于正则表达式 148

14.1.1 正则表达式的写法与用途 148

14.1.2 建立正则表达式对象 149

14.2 正则表达式的样式与匹配 149

14.2.1 以一般文字进行匹配 149

14.2.2 匹配行首与行尾 150

14.2.3 指定想要匹配成功的文字范围 151

14.2.4 匹配任意字符 152

14.2.5 使用反斜线的样式 153

14.2.6 反复出现 154

14.2.7 最短匹配 156

14.2.8 “()”与反复 156

14.2.9 多选 157

14.3 使用quote方法的正则表达式 157

14.4 正则表达式的选项 157

14.5 回溯参照 159

14.6 使用正则表达式的方法 159

14.6.1 sub方法与gsub方法 160

14.6.2 scan方法 160

14.7 正则表达式的示例 161

练习 162

第15章 IO类 163

15.1 输入/输出的种类 163

15.1.1 标准输入/输出 163

15.1.2 文件输入/输出 165

15.1.3 open-uri.rb 166

15.1.4 stringio.rb 166

15.2 基本的输入/输出操作 167

15.2.1 输入操作 167

15.2.2 输出操作 169

15.3 文件指针 170

15.4 二进制模式与文本模式 171

15.5 缓冲处理 171

15.6 与指令交换数据 173

练习 174

第16章 File类与Dir类 175

16.1 File类 175

16.1.1 更改文件名 175

16.1.2 复制文件 176

16.1.3 删除文件 176

16.2 目录的操作 176

16.2.1 读取目录内容 177

16.2.2 Dir.glob 179

16.2.3 建立目录与删除 180

16.3 文件与目录的属性 180

16.3.1 获取属性 180

16.3.2 FileTest模块 182

16.4 文件名的操作 183

16.5 与文件操作相关的程序库 184

16.5.1 find.rb 184

16.5.2 tempfile.rb 185

16.5.3 fileutils.rb 185

练习 187

第17章 Time类与Date类 188

17.1 Time类、Date类、

17.1 DateTime类 188

17.2 获取Time对象 189

17.3 计算时间 189

17.4 时间的格式 189

17.5 本地时间 190

17.6 解析字符串 191

17.7 使用DateTime类 191

17.8 DateTime类与Time类的差异 192

17.8.1 DateTime类表示一天的方式 192

17.8.2 时差处理的差异 193

17.9 使用Date类求日期 194

17.10 计算日期 194

17.11 日期格式 195

17.12 解析字符串 195

练习 195

第4部分 灵活使用Ruby

第18章 Ruby的其他补充知识 198

18.1 命令行选项 198

18.1.1 调试、运行确认 198

18.1.2 获取信息 200

18.1.3 单行程序(one-liner) 200

18.1.4 安全性检查 201

18.1.5 其他 202

18.2 环境变量 203

18.3 常数 204

18.4 内建变量 204

18.5 内建常数 207

18.6 多重赋值 208

18.7 BEGIN{}与END{} 209

18.8 alias 209

18.9 undef 210

18.10 虚拟变量 210

第19章 运算符 211

19.1 逻辑运算符的应用 211

19.2 条件运算符 212

19.3 自我赋值 213

19.4 范围运算符 214

19.5 运算符的优先次序 214

19.6 定义运算符 215

19.6.1 二元运算符 215

19.6.2 单项运算符 216

19.6.3 数组参照运算符 216

第20章 迭代器(iterator) 219

20.1 迭代器与区块调用 219

20.2 迭代器的基础知识 219

20.3 各式各样的迭代器 221

20.3.1 用在数组上 221

20.3.2 用在杂凑上 221

20.3.3 用在文件上 222

20.4 Enumerable模块 223

20.4.1 each方法 223

20.4.2 collect方法 223

20.4.3 sort方法 223

20.4.4 sort_by方法 224

20.5 实现迭代器 225

第21章 Mix-in 231

21.1 include方法 231

21.2 Comparable模块 231

21.3 Enumerable模块 233

21.4 与继承的关系 236

21.5 方法的查找规则 236

第5部分 制作应用

第22章 日志文件解析 240

22.1 浅谈日志文件访问 240

22.2 查询访问数 241

22.3 查询访问日期 242

22.4 以图表显示访问日期 245

22.5 只统计特定文件的访问次数 246

第23章 查找邮政编码 247

23.1 邮政编码数据库 247

23.2 读文件 248

23.3 gdbm程序库 248

23.4 生成数据 249

23.5 查找数据 250

23.6 jzipcode.rb 251

23.7 执行与使用 251

23.8 总结 252

第24章 解析HTML 253

24.1 关于HTML 253

24.1.1 元素与标签 253

24.1.2 注释 254

24.1.3 字符引用 254

24.2 建立程序 255

24.2.1 注释的解析 255

24.2.2 标签的解析(一) 256

24.2.3 文字数据的解析 256

24.2.4 示例 256

24.2.5 标签的解析(二) 258

24.3 超链接一览 261

下载地址:网盘下载

原文地址:https://www.cnblogs.com/longgg/p/8464778.html

时间: 2024-08-03 00:38:49

RubyProgramming:向Ruby之父学程序设计pdf的相关文章

Ruby之父讲什么是闭包

有一次,我参加了一个叫做"Ruby集训"的活动,那是一个由想学习Ruby的年轻人参加的,历时5天4夜的Ruby编程学习活动,对参加者来说是一次非常宝贵的经验.第1天是入门培训,第2天将Ruby系统学习一遍,然后第3天到第4天分组各自制作一个相当规模的游戏,并在最后一天进行展示,可以说是一次十分军事化的集训活动.我只到现场去了大概两天,不过那些勇于向高难度课题发起挑战的年轻人还是给我留下了深刻的印象.在那次集训活动中,有一位参加者问:"闭包是什么?"担任讲师的是我的学

Streem:Ruby之父开发的新脚本语言

刚看到Ruby语言的开发者松本行弘(Matz,全名是Yukihiro Matsumoto)又启动了一门新语言的开发,名叫Streem,还处在非常原始的阶段,只有三个文件,代码在GitHub上. 看Matz自己的说明,Streem是一种基于流的并发脚本语言,类似于shell/awk/,但语法更为丰富, 用Streem可以这么写一个简单的cat程序: STDIN | STDOUT 一个简单的FIZZBUZZ程序 seq(100) | {|x| if x % 15 == 0 { "FizzBuzz&q

2017广东工业大学程序设计竞赛 E倒水(Water)

原题链接:http://www.gdutcode.sinaapp.com/problem.php?cid=1057&pid=4 Problem E: 倒水(Water) Description 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会

2017广东工业大学程序设计竞赛决赛-tmk买礼物

tmk买礼物 Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第2147483647位顾客,本店在搞一个活动,对本店第2147483647位顾客进行赠送活动.你先看看你有多少钱?” TMK一摸口袋,发现只有n个硬币,每个硬币的价值为a[i]. 然后店主继续说:“现在你用你的钱凑一些数,如果你的钱能凑成[0,x]里面所有的数,那么你将会免费获得该店价值x元的代金

2017广东工业大学程序设计竞赛决赛 G 等凹数字

题意: Description 定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如543212345,5544334455是合法的等凹数字,543212346,123321,111111不是等凹数字.现在问你[L,R]中有多少等凹数字呢? Input 第一行一个整数T,表示数据的组数. 接下来T行每行俩个数字L和R,(1<=L<=R<=1e18) Output 输出一个整数,

2017年西南民族大学程序设计竞赛-网络同步赛(代码)

20598954 nmphy D 答案正确 8 512 486 C++ 2017-12-30 14:30:35 20598712 nmphy E 答案正确 3 504 695 C++ 2017-12-30 14:25:59 20598181 nmphy E 答案正确 3 484 659 C++ 2017-12-30 14:15:16 20597638 nmphy E 答案正确 3 504 505 C++ 2017-12-30 14:05:08//比赛时候这里显示的是WA,而且显示准确率5% 20

2017年西南民族大学程序设计竞赛-网络同步赛

题目描述 现在有一个N*M的矩形星图.其中包括恒星和黑洞.恒星可以向上.下.左.右发射光束,且允许光束从其中穿过:黑洞会吸收所有经过的光束. 若一颗恒星向上.下.左.右发射光束,你能告诉我,该光束能否避免被黑洞吸收,进入星图之外的区域么? 输入描述: 单组输入.第一行三个正整数N,M,Q(1 <= N,M<= 1000,1 <= Q <= 1000000),分别表示矩阵的行列,以及询问的个数,询问之间相互独立.然后一个N*M的矩阵,由’*’和’#’构成,表示星图.’*’表示恒星,’

2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛)-G(DP)

题目链接:https://ac.nowcoder.com/acm/contest/553/G 题意:给定n,k,(1<=n<=5e5)然后给出n个数ai(1<=ai<=1e5),问按顺序从1..n分组,最多能有多少个组的异或和为k. 思路:自然的,我们用dp[i]表示到第i个人的时候最多有多少个组的异或和为k.计算dp[i]时,有两种情况,要么在第i个人后面分出一组,要么不分.不分的话dp[i]=dp[i-1]就可以了; 如果分得话,就要找到上一个组的终点下标,我们可以计算到第i个

Ruby相关图书推荐

Ruby基础教程第4版 作      者 [日] 高桥征义,[日] 后藤裕藏 著:何文斯 译:[日] 松本行弘 校 出 版 社 人民邮电出版社 出版时间 2014-09-01 版      次 4 页      数 334 印刷时间 2014-09-01 开      本 16开 纸      张 胶版纸 印      数 1 I S B N 9787115366467 推荐指数:★★★★★ 购买地址:立即购买 Ruby元编程 作      者 Paolo Perrotta 著:廖志刚 译 出