Ruby是一种跨平台、面向对象的动态类型编程语言。Ruby体现了表达的一致性和简单性,它不仅是一门编程语言,更是表达想法的一种简练方式。它不仅受到广大程序员的欢迎,无数的软件大师亦为其倾倒。Programming Ruby是关于Ruby语言的一本权威著作,也被称为PickAxe Book(镐头书,由封面上的工具得名)。本书是它的第2版,其中包括超过200页的新内容,以及对原有内容的修订,涵盖了Ruby 1.8中新的和改进的特性以及标准库模块。它不仅是您学习Ruby语言及其丰富特性的一本优秀教程,也可以作为日常编程时类和模块的参考手册。\r\n 本书适合各种程度的Ruby程序员,无论新手还是老兵,都会从中得到巨大的帮助。
第1版序 \r\n第2版序 \r\n前言 \r\n路线图 \r\n第1部分 Ruby面面观 \r\n 第1章 入门\r\n 1.1 安装Ruby\r\n 1.2 运行Ruby\r\n 1.3 Ruby文档:RDoc和ri\r\n 第2章 Ruby.new \r\n 2.1 Ruby是一门面向对象语言 \r\n 2.2 Ruby的一些基本知识 \r\n 2.3 数组和散列表 \r\n 2.4 控制结构 \r\n 2.5 正则表达式 \r\n 2.6 Block和迭代器 \r\n 2.7 读/写文件 \r\n 2.8 更高更远 \r\n 第3章 类、对象和变量 \r\n 3.1 继承和消息 \r\n 3.2 对象和属性 \r\n 3.3 类变量和类方法 \r\n 3.4 访问控制 \r\n 3.5 变量 \r\n 第4章 容器、Blocks和迭代器 \r\n 4.1 容器 \r\n 4.2 Blocks和迭代器 \r\n 4.3 处处皆是容器 \r\n 第5章 标准类型 \r\n 5.1 数字 \r\n 5.2 字符串 \r\n 5.3 区间 \r\n 5.4 正则表达式 \r\n 第6章 关于方法的更多细节 \r\n 6.1 定义一个方法 \r\n 6.2 调用方法 \r\n 第7章 表达式 \r\n 7.1 运算符表达式 \r\n 7.2 表达式之杂项\r\n 7.3 赋值 \r\n 7.4 条件执行 \r\n 7.5 Case表达式\r\n 7.6 循环 \r\n 7.7 变量作用域、循环和Blocks \r\n 第8章 异常,捕获和抛出 \r\n 8.1 异常类 \r\n 8.2 处理异常 \r\n 8.3 引发异常 \r\n 8.4 捕获和抛出 \r\n 第9章 模块 \r\n 9.1 命名空间 \r\n 9.2 Mixin \r\n 9.3 迭代器与可枚举模块 \r\n 9.4 组合模块 \r\n 9.5 包含其他文件 \r\n 第10章 基本输入和输出 \r\n 10.1 什么是 IO 对象 \r\n 10.2 文件打开和关闭 \r\n 10.3 文件读写 \r\n 10.4 谈谈网络 \r\n 第11章 线程和进程 \r\n 11.1 多线程 \r\n 11.2 控制线程调度器 \r\n 11.3 互斥 \r\n 11.4 运行多个进程 \r\n 第12章 单元测试 \r\n 12.1 Test::Unit框架 \r\n 12.2 组织测试 \r\n 12.3 组织和运行测试 \r\n 第13章 当遇到麻烦时 \r\n 13.1 Ruby调试器 \r\n 13.2 交互式Ruby \r\n 13.3 编辑器支持 \r\n 13.4 但是它不运作 \r\n 13.5 然而它太慢了 \r\n第2部分 Ruby与其环境 \r\n 第14章 Ruby和Ruby世界 \r\n 14.1 命令行参数 \r\n 14.2 程序终止 \r\n 14.3 环境变量 \r\n 14.4 从何处查找它的模块 \r\n 14.5 编译环境 \r\n 第15章 交互式Ruby Shell \r\n 15.1 命令行 \r\n 15.2 配置 \r\n 15.3 命令 \r\n 15.4 限制 \r\n 15.5 rtags与xmp \r\n 第16章 文档化Ruby \r\n 16.1 向Ruby代码中添加RDoc \r\n 16.2 向C扩展中添加RDoc \r\n 16.3 运行RDoc \r\n 16.4 显示程序用法信息 \r\n 第17章 用RubyGems进行包的管理 \r\n 17.1 安装RubyGems \r\n 17.2 安装程序Gems \r\n 17.3 安装和使用Gem库 \r\n 17.4 创建自己的Gems \r\n 第18章 Ruby与Web \r\n 18.1 编写CGI脚本 \r\n 18.2 Cookies \r\n 18.3 提升性能 \r\n 18.4 Web服务器的选择 \r\n 18.5 SOAP及Web Services \r\n 18.6 更多信息 \r\n 第19章 Ruby Tk \r\n 19.1 简单的Tk应用程序 \r\n 19.2 部件 \r\n 19.3 绑定事件 \r\n 19.4 画布 \r\n 19.5 滚动 \r\n 19.6 从Perl/Tk文档转译 \r\n 第20章 Ruby和微软Windows系统 \r\n 20.1 得到Ruby for Windows \r\n 20.2 在Windows下运行Ruby \r\n 20.3 Win32API \r\n 20.4 Windows 自动化 \r\n 第21章 扩展Ruby \r\n 21.1 你的第一个扩展 \r\n 21.2 C中的Ruby对象 \r\n 21.3 Jukebox扩展 \r\n 21.4 内存分配 \r\n 21.5 Ruby的类型系统 \r\n 21.6 创建一个扩展 \r\n 21.7 内嵌Ruby解释器 \r\n 21.8 将Ruby连接到其他语言 \r\n 21.9 Ruby C语言API \r\n第3部分 Ruby的核心 \r\n 第22章 Ruby语言 \r\n 22.1 源代码编排 \r\n 22.2 基本类型 \r\n 22.3 名字 \r\n 22.4 变量和常量 \r\n 22.5 表达式 \r\n 22.6 方法定义 \r\n 22.7 调用方法 \r\n 22.8 别名 \r\n 22.9 类定义 \r\n 22.10 模块定义 \r\n 22.11 访问控制 \r\n 22.12 Blocks,Closures和Proc对象 \r\n 22.13 异常 \r\n 22.14 Catch 和 Throw \r\n 第23章 Duck Typing \r\n 23.1 类不是类型 \r\n 23.2 像鸭子那样编码 \r\n 23.3 标准协议和强制转换 \r\n 23.4 该做的做,该说的说 \r\n 第24章 类与对象 \r\n 24.1 类和对象是如何交互的 \r\n 24.2 类和模块的定义 \r\n 24.3 顶层的执行环境 \r\n 24.4 继承与可见性 \r\n 24.5 冻结对象 \r\n 第25章 Ruby安全 \r\n 25.1 安全级别 \r\n 25.2 受污染的对象 \r\n 第26章 反射,ObjectSpace和分布式Ruby \r\n 26.1 看看对象 \r\n 26.2 考察类 \r\n 26.3 动态地调用方法 \r\n 26.4 系统钩子 \r\n 26.5 跟踪程序的执行 \r\n 26.6 列集和分布式Ruby \r\n 26.7 编译时?运行时?任何时 \r\n第4部分 Ruby库的参考 \r\n 第27章 内置的类和模块\r\n 第28章 标准库 \r\n第5部分 附录 \r\n 附录A Socket库 \r\n 附录B MKMF参考 \r\n 附录C 支持 \r\n 附录D 书目\r\n 索引(Index)
Dave Thomas是Ruby社区的一根顶梁柱,而且亲自负责Ruby许多创新性方向的探讨和开创工作。他和原来的合著有Andy Hunt是Pragmatic Programmer以及Pragmatic Bookshelf的创始人。Chad Fowler是Ruby Central,Inc.的共同事董事,并且始终是Ruby社区中活跃且起推进作用的力量。
您可以在www.pragmaticprogrammer.com上联系这些作者。
前言
Preface
本书是Programming Ruby的第2版,Programming Ruby已广为Ruby爱好者所知。它是Ruby编程语言的教程和参考文献。如果你有本书的第1版,你会发现这一版有了重大变化。
当Andy和我写第1版的时候,我们不得不介绍Ruby的背景和吸引力。其中我们写道:“当发现Ruby时,我们意识到找到了一直在寻找的东西。和我们曾经用过的任何语言相比,Ruby都称得上是罕见的。你可以集中精力于解决手头上的问题而不是与编译和语言本身周旋。这就是它使你成为一位更好的程序员的方法:通过让你将时间花在为用户创建解决方案上而不是编译上。”
今天这种信念变得更强了。4年后,Ruby仍旧是我们的选择:我用它来开发客户端程序,用它来运行我们的出版商务系统,还用它来做所有使系统运行更流畅的小程序。
在这4年中,Ruby发展迅速。大量的方法被加入内建的类和模块,标准库(那些包含在Ruby发行版中的库)也有了重要发展。现在社区有了标准的文档系统(RDoc),而RubyGems也成了为打包发行Ruby代码的系统选择。
这些改变是令人激动的,但是这也使得本书第1版变得有点过时。第2版弥补了这一缺陷:像第1版一样,它是基于Ruby的最新版而编写的。
Ruby版本
Ruby Versions
本书阐述的是Ruby 1.8(特别涵盖了集成入Ruby 1.8.2的改变)。
用来写本书的Ruby版本到底是什么?让我们来问Ruby吧。
% ruby -v
ruby 1.8.2 (2004-12-30) [powerpc-darwin7.7.0]
这演示了重要的一点。你在本书中看到的大多数代码例子都在我排版本书时被实际执行过。当你看到一个程序的输出时,该输出是通过实际运行代码并将结果插入到本书而成的。
本书的变动
Changes in the Book
和第1版相比,除了更新到Ruby 1.8,你还会发现一些其他的变化。
在本书的前半部分,我新加了6章。与第1版相比,入门一章对设置和运行Ruby做了更完整的介绍。第二个新加入的单元测试章反映了Ruby爱好者对测试越来越重视。第三个新的章节涵盖了Ruby程序员使用的三个工具:用来体验Ruby的irb,用来给代码写文档的RDoc以及用来打包发布代码的RubyGems。新添的最后一章介绍了duck typing,这种编程哲学和Ruby背后的思想非常一致。
新加入的还不止这些。你还会发现线程一章大大扩展了对同步的讨论,而编写Ruby扩展一章的大部分也被重写了。关于网页编程一章讨论了一个可选的模板系统并加入了SOAP一节。语言参考一章也被大大扩展了(特别是关于block、procs、break和return新规则的部分)。
本书的后半部分对内建的类和模块进行了介绍,该部分包含的重要改动超过了250处。其中很多是方法的更新,一些是更新过时的老方法,而另一些是具有新行为的方法。你还会发现加入了许多对新模块和类的介绍。
最后,本书用了一节来介绍标准库。自Ruby 1.6以来标准库有了极大的发展,现在它的内容如此之多,以至于没有上千页篇幅根本就不可能对之进行较为详细的介绍。同时,Ruby Documentation项目正在忙于为库代码添加RDoc文档(第199页的第16章介绍了RDoc)。这意味着你可以使用Ruby发行版自带的ri工具来获得关于库模块的精确
的、最新的文档。综合上述原因,我决定改变介绍库文档的风格——现在该部分是可用库的一个路线图,显示了一些代码样例并介绍了大致用法。我把底层的细节留给了RDoc。
贯穿本书,我使用页边空白中的一个小符号,就像这里的这个一样,来尽量标明1.6和1.8之间的变化。没变的一点是:在本书的正文中当谈论到作者时我仍旧使用我们一词。里面的很多词都源自第1版,我当然不想侵占Andy在那本书上的工作成果。
总之,本书是对第1版的重大更新。我希望你觉得它有用。
资源
Resources
访问Ruby网站http://www.ruby-lang.org,看看有什么新内容。在新闻组和邮件列表中(参见附录C)可以和其他Ruby用户进行讨论。
而且我也非常希望能得到你的反馈。欢迎任何评论,提出建议,以及对书中的错误和例子中的问题给予指正。请发邮件到:
rubybook@pragmaticprogrammer.com
如果你告诉我们书中的错误,我会将它们加入到位于以下地址的勘误表中:
http://www.pragmaticprogrammer.com/titles/ruby/errata.html
从下面的地址中你会发现书中几乎所有样例代码的源代码链接:
http://www.pragmaticprogrammer.com/titles/ruby
致谢
Acknowledgments
我曾在Ruby邮件列表中询问是否有人愿意帮助审查此书的第2版。几乎有一百名志愿者响应了我的请求。为了便于管理,我不得不依据先来先得的原则限制人数。即使这样,那些出色的审查员还是给了我超过1.5MB的建议。他们指出了许多问题,从放错地方的逗号到遗漏的方法。我不可能获得比这更好的帮助了,所以非常“感谢”Richard Amacker, David A. Black, Tony Bowden, James Britt, Warren Brown, Mike Clark, Ryan Davis (感谢那个日文PDF!),Guy Decoux, Friedrich Dominicus, Thomas Enebo, Chad Fowler, Hal Fulton, Ben Giddings, Johan Holmberg, Andrew Johnson, Rich Kilmer, Robert Klemme, Yukihiro Matsumoto, Marcel Molina Jr., Roeland Moors, Michael Neumann, Paul Rogers, Sean Russell, Hugh Sasse, Gavin Sinclair, Tanaka Akira, Juliet Thomas, Glenn Vanderburg, Koen Vervloesem和Austin Ziegler.
Chad Fowler写了RubyGems一章。实际上,他写了两次。写第一次的时候他在欧洲休假,不幸在回家的路上,他的Powerbook被偷了,而他所写的书稿也丢失了,所以回去以后,他只好又坐下来重写了一遍。对此我感激不尽。
Kim Wimpsett做了编辑这一费力不讨好的工作。她做了大量的工作(而且超过了记录),而本书中行业术语的数量和我对语言的组织能力之差使得这项任务更加困难。Ed Giddens设计了出色的封面,该封面极好地混合了新老封面。谢谢他们!
最后,我仍想对Ruby的创建者Yukihiro “Matz” Matsumoto致以深深的谢意。在这段成长和变化的时间内,他一直以快乐和专一的精神来改进Ruby语言。Ruby社区的友善和开发精神是他个人精神的直接体现。
谢谢各位。Domo arigato gozaimasu.
Dave Thomas
THE PRAGMATIC PROGRAMMERS
http://www.pragmaticprogrammer.com
符号约定
Notation Conventions
在本书中,我们使用如下排版符号。
代码样例使用等宽字体显示。
class SampleCode
def run
#...
end
end
在正文中,Fred#do_something是对Fred类的实例方法(这里是do_something)的引用,Fred.new 是一个类方法,而Fred::EOF是一个类常量。使用井号符来表示实例方法的决定是很棘手的:它不是合法的Ruby语法,但是我们认为区分一个类的实例方法和类方法是很重要的。当你看到File.read时,你知道我们在讨论类方法read。而当你看到File#read时,我们在引用实例方法read。
本书包含了很多Ruby代码片断。如果可能,我们会尽量显示运行它们的结果。一个最简单的例子,我们将表达式的值和表达式显示在同一行上。例如:
a = 1
b = 2
a + b → 3
在这里,你能看到 a + b 的计算结果3显示在了箭头的右边。注意如果你只是运行这个程序,那么你不会看到输出结果3——你需要使用类似 puts 这样的方法将其输出。
有时我们对赋值语句的值感兴趣,这种情况下我们也会把它显示出来。
a = 1 → 1
b = 2 → 2
a + b → 3
如果程序输出更复杂,那么我们将其显示在程序代码下面。
3.times { puts "Hello!" }
输出结果:
Hello!
Hello!
Hello!
在某些库文档中,我们需要在输出中显示空格。你会看到空格被表示成“ ”字符。
命令行调用使用等宽字体表示,而参数使用斜体表示。可选元素被放在中括号中。
ruby [ flags ... ] [ progname ] [ arguments ... ]
无封面