人生苦短
这是一本关于秘诀的书籍,其中包括:对一般问题的解决方案、复制和粘贴代码段、解释、示例和简短指南。.
本书意欲为读者节省时间。人们总是说,时间就是金钱,但时间也是个人生命的构成。我们的生命应当花在创造新事物上,而不是用于抗击我们自己的错误或者解决那些已经解决过的问题。我们提供此书的愿望是:它的所有读者所节省的时间远远超过我们编写它所花掉的时间。
Ruby编程语言本身是一种非常节省时间的工具,与其他编程语言相比,它能产生更高的生产率,因为用户会花费更多的时间让计算机做自己想做的事情,而思考语言本身的时间则较少。但是,对于一名Ruby程序员,可能有很多情况即使没做任何事情也花费了很多时间,下面是我们遇到过的各个方面:
将时间花在编写通用算法的Ruby实现上。
将时间花在调试通用算法的Ruby实现上。
将时间花在发现和修正Ruby特有的缺陷上。
将时间花在应当自动执行的重复性任务上(包括重复性编程任务!)。
将时间花在重复其他人已经公开实现过的工作上。
将时间花在搜索运行x的库上。
将时间花在对运行x的多个库进行评估和确定上。
将时间花在由于文档的匮乏或过时而学习如何使用库上。
将时间浪费在由于惧怕而不敢接触有用的技术上。
我们以及本书的许多投稿人还清楚地记得我们自己浪费的那些时日。我们将自己的经历提炼进本书中,从而让读者不再浪费自己的时间——或者至少让读者愉快地将时间花在其他更有趣的问题上。
我们的另一个目标是扩大读者的兴趣。如果读者阅读本书后希望能够使用Ruby生成算法音乐,没问题,12.14节将会节省读者的时间。迄今为止,读者更可以不必考虑可能性问题。本书中每个秘诀的形成和编写都在理念上带有如下这样两个目标:节省读者时间以及让读者的头脑对新观点保持活跃。
本书读者对象
本书的目标读者是那些至少懂一点Ruby或者对一般性编程相当了解的人。这不是一本Ruby指南(要查看某些真正的指南,请参见下面的“其他资源”一节),但是,如果读者已经熟悉一些其他的编程语言,那么应当能够通过阅读本书的前10章并在阅读过程中实践列出的代码,从而能够做到对Ruby无师自通。
我们已经包含的秘诀适用于各级读者,从那些刚刚开始使用Ruby的用户到那些需要偶尔进行参考的专家。我们主要致力于一般的编程技术,但也涵盖了特定的应用程序框架(类似于Rails和GUI库上的Ruby)和最佳实践(类似于单元测试)。
即使读者只准备将本书作为参考用书,我们也建议读者通读一遍全书,以便了解我们所解决的问题。这本书很厚,但并没有解决所有问题。如果读者在阅读后发现找不到自己问题的解决方案,或者对自己问题可能有所帮助的信息,那么就是在浪费时间了。
如果读者事先通读本书,那么会对本书中我们所涉及的问题有一个清晰的概念,从而能获得更好的命中率。读者可以知道何时本书能够帮助自己,以及何时应当参考其他书籍、进行Web搜索、询问朋友或者从其他途径获得帮助。
. 本书组织结构
本书共有23章,每一章集中在一类编程或一种特殊数据类型。目前对章节的概述应当能够令读者了解我们如何划分各类秘诀。每一章还包括对章节本身有些冗长的介绍,给出章中各节更详细的描述。我们强烈建议读者浏览章节介绍和内容列表。
我们用前6章介绍Ruby的内置数据结构。
第1章 字符串,包括构建、处理和操作文本字符串的秘诀。我们特别介绍了若干正则表达式的秘诀(1.17节至1.19节),但是,我们重点关注的是特定的Ruby问题,而正则表达式则是一种十分常见的工具。如果读者尚未使用过它,或者对使用它感到恐惧,那么我们建议读者阅读一本在线指南或由Jeffrey Friedl撰写的Mastering Regular Expressions一书(O'Reilly出版)。
第2章 数字,介绍了对不同类型的数字的表示,包括:实数、复数、任意精度的小数,等等。它还包括了一般的数学和统计学算法的Ruby实现,并解释了在创建自己的数字类型时会遇到的一些Ruby独有的特性(2.13节和2.14节)。
第3章 日期与时间,涉及Ruby在时间处理上的两个接口:一个基于C的time库,这在其他编程语言中比较常见;另一个以纯Ruby实现,更合乎语言习惯。
第4章 数组,介绍Ruby最简单的复合数据类型:数组。许多数组的方法实际上是Enumerable混入的方法,这意味着用户可以在散列或其他数据类型上应用这些秘诀。Enumerable的某些特性在本章中有所涉猎(4.4节和4.6节),还有一些特性在第7章中介绍。
第5章 散列,介绍了Ruby的另一种基本复合数据类型:散列。散列令对象与其名字相关联从而便于以后的查找(散列有时被称为“查找表”或“字典”,两个都是有效的名字)。结合使用散列与数组可以轻松地构建深奥、复杂的数据结构。
第6章 文件与目录,包括读、写和操作文件的技术。Ruby的文件访问接口基于标准C的文件库,因此读者可能很熟悉。本章还涉及了Ruby用于搜索和操作文件系统的标准库,许多秘诀将在第23章中再次给出。
前6章处理特定的算法问题,接下来的4章会更加抽象:它们涉及到Ruby的方言和基本原理。如果用户无法令Ruby语言本身去做自己想做的事,或者在按Ruby“应当”具有的外观来书写Ruby代码时遇到困难,那么下面这4章中的秘诀会有所帮助。
第7章 代码块与迭代,包括了研究Ruby代码块(也称为闭包)各种可能性的秘诀。
第8章 对象与类,介绍了Ruby承担的面对对象编程的任务。它包括了书写不同类型的类和方法的秘诀,以及少量以示例说明所有Ruby对象能力的秘诀(例如冻结和克隆)。
第9章 模块与命名空间,介绍了Ruby的模块。这些结构用于将新行为加入现有类中,并将功能分隔进不同的命名空间中。
第10章 反射与元编程,介绍了以编程手段研究和修改Ruby类定义的技术。
第6章介绍了基本的文件访问,但没有触及更多的特定文件格式。我们将用下面3章内容介绍流行的数据存储方法。
第11章 XML和HTML,给出如何处理最流行的数据交换格式。本章主要涉及分析其他人的XML文档和Web网页(参见11.9节)。
第12章 图形与其他文件格式,介绍除XML和HTML之外的其他数据交换格式,特别关注了图形的生成与操作。
第13章 数据库和持久性,涉及Ruby对数据存储格式最好的接口,不管是串行地将Ruby对象存入磁盘,还是在数据库中存储结构化数据。从串行化数据和索引文本到Ruby针对流行SQL数据库的客户库,再到类似于ActiveRecord、可完全避免书写SQL语句的完全成熟的抽象层,奉章对其不同方法皆给出了相应的示例。当前对Ruby最流行的使用是在网络应用程序中(大多数是通过Ruby on Rails)。我们用下面3章的内容介绍不同类型的应用程序:
第14章 Internet服务,通过举例说明从Ruby库编写的大量客户端和服务端开始介绍我们的网络覆盖。
第15章 Web开发:Ruby on Rails,介绍这个正强有力地提升Ruby声望的Web应用程序框架。
第16章 Web服务及分布式编程,介绍Ruby编程中在计算机间共享信息的两种技术。为了使用Web服务,用户要向其他计算机上发出程序的HTTP请求,这通常是用户无法控制的。Ruby的DRb库可使用户共享运行位于一组计算机上的程序之间的Ruby数据结构,一切皆可在控制中。
然后我们用下面3章的内容介绍出现在项目的主要编程工作周围的辅助性任务。
第17章 测试、调试、优化以及文档化,重点介绍处理异常条件以及为用户代码创建单元测试,还有若干关于调试和优化过程的秘诀。
第18章 打包和发布软件,主要处理Ruby的Gem打包系统和宿主许多gem文件的RubyForge服务器。其他章中的许多秘诀要求读者安装特殊的gem,因此如果读者不熟悉gem,那么我们建议读者特别阅读18.2节。本章还给出如何为自己的项目创建和发布gem。
第19章 用Rake自动执行任务,介绍了最流行的Ruby构建工具。使用Rake可以像运行单元测试一样编写普通任务,或者像gem一样打包自己的代码。尽管它通常用在Ruby项目中,但它是一种通用的构建语言,用户可将其用在任何可以使用Make的地方。
我们用最后4章介绍其他主题。
第20章 多任务和多线程,给出如何使用线程同时做更多的事,以及如何用Unix子进程运行外部命令。
第21章 用户界面,介绍用户界面(除Web界面之外,其在第15章进行了介绍)。我们讨论了命令行界面、带Curses和HighLine的基于字符的GUI、用于各种平台的GUI工具包,以及更多种无名的用户界面(21.11节)。
第22章 用其他语言扩展Ruby,主要介绍为了性能或获得对更多库的访问,将Ruby与其他语言相连接。本章大部分内容着力于获得对C库的访问,但有一个关于JRuby的秘诀,它是运行在Java虚拟机上的Ruby实现(22.5节)。
第23章 系统管理,全面介绍完成管理任务的自包含程序,通常要使用其他章的技术。这些秘诀重点介绍了Unix管理,但也有一些针对Windows用户(23.2节)和某些交叉平台脚本的资源。
代码清单的工作原理
学习本书意味着要执行秘诀。我们的秘诀中有些定义了大量的Ruby代码,读者只需简单地将代码放入自己的程序中并使用即可,而无需真正地理解它们(19.8节就是一个很好的例子)。但是,大多数秘诀对技术进行了举例说明,而学习一项技术最好的途径就是实践它。
我们本着此种精神编写秘诀及其代码清单,大部分清单类似于对秘诀中描述内容进行单元测试;它们翻来覆去地测试对象并给出结果。
目前Ruby安装文件带有一个称为irb的交互式解释器。在一个irb会话内,用户可以键入Ruby代码行并立刻能够看到输出,而不必创建一个Ruby程序文件并通过解释器来运行它。
我们的秘诀中大部分以用户可以直接在irb会话中键入或进行复制/粘贴的方式存在。要想进一步研读秘诀,我们建议读者从irb会话开始并在阅读过程中运行代码清单,这样做可以使得对概念的理解能够比仅进行阅读要深刻一些。完成这一步后,读者可以进一步试验那些运行代码清单时自己定义的对象。
有时我们希望将读者的注意力引向Ruby表达式所希望的结果,因此,我们使用了Ruby注释,它包含指向表达式期望值的ASCII箭头。这与irb用于告知用户每个由用户键入的表达式的值所使用的箭头相同。
安装软件
Ruby预安装在Mac OS X和大多数Linux安装程序中。Windows没有自带Ruby,但可以很容易地获得单击一次式安装程序(One-Click Installer):参见http://rubyforge.org/projects/rubyinstaller/。
如果用户使用Unix/Linux系统而没有安装Ruby(或者用户希望进行升级),那么产品的打包系统可以提供一个Ruby程序包。在Debian GNU/Linux上,它作为ruby—[version]程序包提供:例如,ruby—1.8或ruby—1.9。Red Hat Linux称其为ruby,Mac OS X上的DarwinPorts系统也是如此。
如果所有这些尝试都失败了,那么可以自己下载Ruby源代码并进行编译。用户可通过访问http://www.ruby-lang.org/的FTP或HTTP获得Ruby源代码。..
本书的许多秘诀都要求用户以Rubygem形式安装第三方库。我们一般倾向于使用单独的解决方案(仅使用Ruby标准库)来解决gem的使用问题,使用基于gem的解决方案来解决要求使用其他类型的第三方软件的问题。
如果用户不熟悉gem,那么可以根据自己的需要参考第18章。开始学习时,用户要做的只是懂得首先在http://rubyforge.org/projects/rubygems/上下载Rubygems库而已(在网页中选择最新版本)。解压缩tarball或ZIP文件,变成rubygems—[version]目录,并以超级用户权限运行下列命令:
$ ruby setup.rb
Rubygems库包括在Windows的单击一次式安装程序中,因此用户在Windows上不必担心这一步。
Rubygems库安装完毕后,就可以很容易地安装其他的Ruby代码。如果某个秘诀中有类似于“Ruby on Rails与rails gem一起提供”之类的话,那么用户可以在命令行中键入下列命令(再次强调,要作为超级用户):
$ gem install rails——include—dependencies
RubyGems库会下载并自动安装rails gem(以及其他相互依赖的gem)。然后,用户就能够完全如其所示地运行秘诀中的代码。
对于新安装的Ruby来说,三个最有用的gem是rails(如果用户试图创建Rails应用程序的话)和Ruby Facets项目提供的两个gem:facets_Core和facets_more。Facets Core库用通常情况下有用的方法扩展了Ruby标准库的类。Facets More库添加了全新的类和模块。Ruby Fecets主页(http://facets.rubyforge.org/)上有完整的索引。
有些Ruby库(特别是一些比较老的库)没有像gem一样打包封装。本书中提到的大多数非gem库在Ruby程序与库的目录Ruby Application Archive(http://raa.ruby-lang.org/)中都有记录。在多数情况下,用户可以在RAA上下载tarball或ZIP文件,并使用18.8节中描述的技术进行安装。
平台差异、版本差异与其他问题
除非有特别注明,各个秘诀描述的都是跨平台概念,代码本身应当以相同方式在Windows、Linux和Mac OS X上运行。大多数平台差异和特定于平台的秘诀在最后几章中给出,这几章包括:第20章、第21章和第23章(但需参见第6章中对Windows文件名的介绍)。
我们使用Ruby 1.8.4版和Rails 1.1.2版编写和测试秘诀,这是编写本书时最新的稳定版本。如果用户运行的是Ruby 1.9(它是编写本书时不稳定的最新版本)或2.0,那么在某些地方我们会提示用户应当对代码进行修改。
尽管我们尽了最大努力,但本书仍可能存在没有标记出来的特定于平台的代码、未捉及的老bug。我们为它们的出现而感到抱歉。如果读者对某个秘诀有疑问,可以查看本书的勘误表(参见下面的内容)。
在本书的若干秘诀中,我们为添加新方法而修改了类似Array的标准Ruby类(例如,参见1.10节,它定义了一种称为String#capitalize_first_letter的新方法)。
之后,这些方法被用于用户程序的每个类实例。这在Ruby中是相当常用的技术:前面提到的Rails和Facets Core库都这样做了。尽管尚存在部分争论,并且可能会导致问题(参见8.4节的更深层讨论),但我们感觉应当在前言中提出这一点,尽管它对于那些新接触Ruby的人来讲过于技术化了。
如果读者不愿意修改标准类,那么可以将我们给出的示例方法放入某个子类,或者在Kernel命名空间中定义它们:也就是说,定义capitalize_first_lelter_of_string来代替重新打开String并在其中定义capitalize_first_letter。
其他资源
如果读者需要学习Ruby,那么标准参考用书是Dave Thomas、Chad Fowler和Andy Hunt(务实的程序员)撰写的Programming Ruby:The Pragmatic Programmer's Guide。该书第一版以HTML格式在线提供(http://www.rubycentral.com/book/),但已经过时。第二版更好一些,并以印刷书或PDF(/http://www.pragmaticprogrammer.com/titles/ruby/)形式提供。比试图阅读第一版更好的主意是购买第二版并使用第一版作为手头的参考书。
由“why the lucky stiff”提供的“Why's(Poignant)Guide to Ruby”用故事来讲授Ruby,像一本英语初级读本一样,它是具有创造力的初学者的最佳用书(http://poignantguide.net/ruby/)。
对于Rails而言,标准读物是Dave Thomas、David Hansson、Leon Breedt和Mike Clark(务实的程序员)撰写的Agile Web Development with Rails。与此类似的还有两本专门针对Rails的书:Rob Orsini撰写的Rails Cookbook(O'Reilly)和Chad Fowler(务实的程序员)撰写的Rails Recipes。
某些常见的Ruby缺陷在Ruby FAQ(http://www.rubycentral.com/faq/,从第4部分开始)和“Things That Newcomers to Ruby Should Know”(http://www.glue.umd.edu/-billtj/ruby.html)中进行了解释。
许多人在学习Ruby前就已经通晓一种或多种编程语言。读者也许会发现使用一本认为必须教会自己编程和Ruby的厚书会妨碍学习Ruby。对于这类读者,我们推荐Ruby创始人Yukihiro Matsumoto撰写的Ruby User's Guide(http://www.ruby-doc.org/docs/UsersGuide/rg/)。这是一本简短的读物,主要介绍Ruby与其他编程语言的差异,它的术语稍有些过时,并且其代码示例运行在独立的eval.rb程序上(使用irb替代),但它是我们所知最好的简介。
有一些文章特别适合于希望学习Ruby的Java程序员:Jim Weirich的“10 Things Every Java Programmer Should Know About Ruby”(http://onestepback.org/articles/10things/)、Francis Hwang的博客文章“Coming to Ruby from Java”(http://fhwang.net/blog/40.html)和Chris Williams的链接收藏“From Java to Ruby(With Love)”(http://cwilliams.textdriven.com/pages/java_to_ruby)。不管名字如何,C++程序员也会从这些文章中受益匪浅。
Ruby Bookshelf(http://books.rubyveil.com/books/Bookshelf/Introduction/Bookshelf)以易读的HTML格式提供了许多关于Ruby的免费书籍,包括上面提过的许多图书。
最后,Ruby的内置模块、类和方法都有极好的文档记录(大多数最初为Ruby编程而编写)。读者可以在http://www.ruby-doc.org/core/和http://www.ruby-doc.org/stdlib/上在线阅读这些文档,还可以在自己安装的Ruby上使用ri命令进行查看。通过类或方法的名字,ri将给出相应的文档。
本书使用的约定
下面是本书使用的印刷约定:
普通文本
表示菜单题头、菜单选项、菜单按钮和键盘加速器(例如Alt与Ctrl)。
斜体(Italic)
表示新术语、URL、电子邮件地址和Unix功能。
等宽字体(Constant Width)
表示命令、选项、开关、变量、属性、键、函数、类型、类、命名空间、方法、模块、性质、参数、值、对象、事件、事件句柄、XML标记、HTML标记、宏、程序、库、文件名、路径名、目录、文件内容、或者命令输出。
等宽粗体(Constant Width Bold)
给出应当由用户键入的命令或其他文本。
等宽斜体(Constant Width Italic)
给出应当由用户的提供值代替的文本。
使用代码示例
本书在这里要帮助读者完成自己的工作。一般而言,读者可以在自己的程序和文档中使用本书的代码。除非读者要重新生成代码的重要部分,否则无需联系我们获取许可。例如,使用本书的某些代码段来编写程序无需请求许可。出售或发布O'Reilly书中示例的CD-ROM无需请求许可。引用本书及示例代码来回答问题无需请求许可。将本书的若干示例代码加入自己产品的文档无需请求许可。
我们鼓励但不要求列出参考出处。一个参考出处通常包括标题、作者、出版社及ISBN。例如:“Ruby Cookbook by Lucas Carlson and Leonard Richardson,Copyright 2006 O'Reilly Media,Inc.,0-596-52369-6”。
如果您觉得自己对代码示例的使用超出了正当使用或上述许可的范围,望不吝联系我们:permissions@oreilly.com。
意见与问题
请通过以下地址把关于本书的评论和问题发送给出版社:
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
100080北京市海淀区知春路49号希格玛公寓B座809室
奥莱理软件(北京)有限公司
本书的Web页上列出了勘误表、示例和任何额外的信息。可登录以下网址查询:
http://www.oreilly.com/catalog/rubyckbk
http://www.oreilly.com.cn/book.php?bn=978-7-302-14770-1
如果想就本书的技术问题发表评论或咨询,请发邮件至:
bookquestions@oreilly.com
info@mail.oreilly.com.cn
关于本书、会议、资源中心和O'Reilly网络的更多信息,请访问O'Reilly的Web站点:
http://www.oreilly.com
http://www.oreilly.com.cn ...