版权
Ruby程序员修炼之道(第2版)
• 著 [美] David A. Black
译 钟凤鸣 陈雪静
责任编辑 杨海玲
• 人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
• 读者服务热线:(010)81055410
反盗版热线:(010)81055315
版权声明
Original English language edition, entitled The Well-Grounded Rubyist, Second Edition by David A. Black published by Manning Publications Co., 209 Bruce Park Avenue, Greenwich, CT 06830. Copyright ©2014 by Manning Publications Co.
Simplified Chinese-language edition copyright ©2015 by Posts & Telecom Press. All rights reserved.
本书中文简体字版由Manning Publications Co.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。
版权所有,侵权必究。
内容提要
这是一本深受好评的书。它不仅是一本纯Ruby的书,也不仅是一本纯Rails的书,而是一本为Rails程序员“优化”过的Ruby书。
本书从Ruby编程语言的基础开始一直讲到动态特性,其中包含大量的真实代码示例并附有详细的注解,对日常使用Ruby进行编程中会遇到的每个知识点都进行了清晰的讲解。本书的内容由浅入深,主要包含Ruby编程语言的语法、面向对象的特性、默认对象self、控制流技术、常用的内置类、正则表达式、I/O操作,最后用大量的篇幅讲述了Ruby中最值得关注的动态特性。
本书不仅适合Ruby编程语言的初学者,也适合有经验的开发者以及那些想要真正提升Ruby编程技术的爱好者阅读和学习,具有极高的参考价值。
对本书第1版的赞誉
“如果要学习Ruby语言,就从这本书开始吧!只用这一本足矣。”
——John Griffin, Overstock.com
“David Black对Ruby语言的理解以及他传授这门知识的能力都是非凡的。”
——Philip Hallstrom, PJKH, LLC
“经过漫长等待,继Ruby for Rails一书之后David的又一力作问世,这次是对Ruby学习的进一步深化。”
——Rick DeNatale, DenHaven Consulting
“想用Ruby学习面向对象或常规编程的所有人的必读之书。”
——Robert Klemme, Orga Systems
“David Black再次创作了一本属于每一位Ruby程序员的案头参考书。”
——Robert Dempsey, Atlantic Dominion Solutions
“如果想学Ruby语言,这是目前为止最好的一本书。”
——M. Edward (Ed) Borasky, ADP
“想知道Ruby的内部工作原理?David Black在本书中为你揭秘。”
——Patrick Steger, Zühlke Engineering AG
“一本翔实的、基于例子并有绝佳代码示例的Ruby编程语言教程,是学习这门语言绝好的书。”
——Doug Warren, Java Web Services
“我多么希望我当时学习Rails的时候就有这本书。”
——Patrick Dennis, Management Dynamics, Inc.
“继Ruby for Rails之后的又一力作。”
——Mark Eagle, Intercontinental Exchange, Inc.
“强烈推荐给每一位Ruby学习者。”
——Greg Donald, VUMC
“这是一本Ruby语言绝妙且详尽的入门指南。”
——Curtis Miller, Freebootr.com
译者序
和大多数人一样,我也是从Ruby on Rails开始结识Ruby语言的。从最早的那个“十分钟构建博客程序”的例子开始,完全地被吸引住了。从那时起,我在业余时间寻找很多资料和图书,学习这个惊艳的Web开发框架。但是在编写Rails程序的时候,其实我们对于Ruby语言知之甚少,学习资源都非常有限,基本上是从看Programming Ruby作为起点的。直到有一天,偶然看到了David A. Black(也就是本书作者)所编写的Ruby for Rails(R4R),才真正上道。终于在阅读该书的过程中,解决了许多编写Rails时对那些“魔法”的疑惑,也真正喜欢上了Ruby语言。转眼间就快10年了,身边那些曾经视Ruby为小众语言的人,后来很多人都开始喜欢上了Ruby,并逐渐在项目中越来越多地使用它。The Rails Way的作者Obie Fernandez在给The Ruby Way作序时写道:
在相当长的一段时间里,使用Ruby的人被置于主流之外,可是现在看来,我们才是主流。
看过一些关于Ruby的书,它们基本上大而全面,从语法基础到面向对象,从I/O编程到图形化接口,从线程到网络编程,从Web编程到测试框架等,却很少有书可以像本书一样,让Ruby初学者和爱好者真正理解Ruby的对象核心设计——对象个性化(object individuation)。理解对象个性化的设计有多重要呢?这是Ruby真正有别于其他语言的魅力所在,是Ruby语言动态特性的主要构成部分。由于它的动态特性,让程序员可以用它编写一门销售部门的技术小白都能学会的领域特定语言(Domain Specific Languages,DSL),然后生成一份漂亮的需求问卷,再稍加努力就可以生成一份非常有专业感的PDF格式版本。当然,这只是开个小小的玩笑,Ruby编写DSL的案例,知名的有Rspec或Cucumber这样的测试框架和Rake这样的make工具,它们都非常强大且易于编写。如果你需要找一本把Ruby基础中每个层面都讲得很细致且能把动态特性中的单例类、单例方法、回调机制、自省机制、可调用对象等晦涩难懂的内容都能讲得清晰明了的书,那么本书一定是不二之选。本书是R4R的一种延续,作者把R4R中关于Ruby的内容重新整理,并加入了许多Ruby的新特性,旨在将Ruby语言的基础用一本书全面概括,为读者将来的Ruby程序员之旅点起一盏航灯。
很荣幸能翻译这本书,这也让我多年的Ruby情结有了实现的机会。深深感谢本书的责任编辑杨海玲老师在翻译过程中给予的极大支持和帮助,同时感谢家人和朋友们提供的支持和鼓励。
最后,希望本书能让你轻松愉快地掌握Ruby语言,也希望你在成为Rubyist的同时能推荐更多的人学习这门优雅的语言。
谢谢!
译者简介
钟凤鸣 海外程序员,常住新西兰,与本书第二译者互为连理。从事企业应用开发和手机APP开发多年,对技术充满热情,渴望不断地学习和运用喜欢的技术。
陈雪静 英语翻译硕士,程序员家属。受本书第一译者的影响,不仅研究英语语言学,也在业余学习计算机语言。
前言
欢迎阅读本书。自第1版出版以来的5年间,Ruby语言有了许多变化和改进,最大的一次改进是在Ruby语言20岁生日(2013年2月24日)那天发布的Ruby 2.0版本。在2013年年末,准确地说是在圣诞节那天,Ruby 2.1版本发布了。这一版已涵盖了Ruby 2.1版本的内容。
本书一直深获好评。这本书满足了大量读者的需求,包括许多新学习Ruby的人和很多已经接触过Ruby但想详尽了解这门语言并确保自己真正理解了这门语言的人。我一直特别高兴的是,一些书评把阅读这本书的体验描述为与Ruby老师面对面。毕竟,我是一名Ruby教师,尽管教学和写作分属不同角色,但两者也并非完全不同。
Ruby语言的大部分没有改变,但还是有相当一部分出现了变化。这次第2版包含了许多新内容,并对原始文本做了大量的审阅和修订。和第1版一样,本书并不打算在Ruby语言上面面俱到,或作为一本标准库参考手册(这类书已有很多),而是对Ruby的对象模型、内置类和重要编程工具的关键环节进行深入的研究和论述。
我想对本书的所有读者表示热烈的欢迎,包括本书第1版的老读者和这本书的新读者。我希望并且相信读者会在本书中找到许多乐趣和惊喜。乐在其中吧!
第1版前言
2006年,Manning出版社出版了我写的Ruby for Rails: Ruby Techniques for Rails Developers。我撰写Ruby for Rails(大家所熟知的R4R)的目的是让Rails的开发者了解Rails开发者也就是Ruby开发者这一事实,同时也让Rails开发者扎实掌握Ruby这门语言。我选择将Ruby语言中的各主题收录到本书(或者选择不收录到本书)是依据我个人的判断标准:选择相对重要的内容给那些想正确和高效使用Rails从而学习Ruby语言的人。
对R4R的评论是非常好的。该书填补了一个空白:它不仅是一本纯Ruby的书,也不仅是一本纯Rails的书,而且是一本可以说是为Rails程序员做过“优化”的Ruby书。我很高兴许多人读完之后问我是否有计划写一本完整的只关于Ruby语言的书,并且鼓励我去写。
长话短说,于是我就写了这本书。
这是一本“纯Ruby”的书,写给所有对Ruby感兴趣的人。它是R4R的传承,但不完全是R4R的升级版。它更多地是改编。有些内容与R4R有重叠,但也有很多新内容(事实上比我原先预期的要多)。所有的内容,无论重叠与否,在第1版书交付印刷的时候都已经被润色和整理,并可以在Ruby 1.9.1版本上运行,这是本书付印时的最新(非常新)版本。
要知道,我的意思并不是说Rails开发者不用读这本书。恰恰相反,我高兴地看到,在R4R出版后的3年里,Rails开发者应该学习Ruby这一观念已被大众认可,许多通过学习Rails初次进入Ruby世界的开发者已对Ruby语言自身的魅力产生了兴趣。本书就是为他们而写的,也是为那些通过各种不同的途径发现Ruby的人而写的。
不论本书能带给你什么,我都希望你乐在其中。
致谢
首先要感谢所有我在第1版中感谢过的人。若没有全体编辑、制作人、审稿人、出版商和同事们,就不会有这本书。
对于第2版来说,我最要感谢的是开发编辑Dan Maharry,他的耐心、支持和指引让这本书走上正轨,否则不会有这本书。技术开发编辑Andrew Gibson扮演专家的角色,他用专业的挑剔眼光来看整本书,这一点对本书大有裨益。文字编辑Jodie Allen对文字的整体润色做出了巨大贡献。技术校对Deepak Vohra认真审查了示例代码,并及时发现了一些问题。校对Melody Dolab通读全文并做了修正。
在前期制作中,Kevin Sullivan保持每一件事都按部就班并按期完成。产品经理Mary Piergies再次用极高的专业性引导本书的完成。排版人员Dennis Dalinnik做得非常出色,一切都很顺畅。在本书的质检阶段,Katie Tennant提出了许多有价值的见解和建议。
一路走来,一些外部评审员提出了很多意见和批评,这一切使我在撰写第2版的时候比第1版更加精练,更具可读性。我要感谢Jason Brown、Marius Butuc、Hector Sansores、Jeffrey Schwab、Doug Sparling、Andrea Tarocchi、Ted Roche和William E. Wheeler。
在第2版写作期间,David Williams自始至终支持和鼓励我,是他让我坚持不懈并保持斗志。在此深表谢意。
和往常一样,我要感谢松本行弘(Matz)创造了美妙的Ruby语言。顺便提一下,若从松本行弘首次公开宣布这个项目之日算起,最近它刚刚过了21岁的生日(2014年2月24日)。让我特别高兴的是,本书第2版出版的时间碰巧大致与这美妙的里程碑吻合。
关于本书
欢迎翻开本书。
Ruby语言由松本行弘(Matz)设计,是一门通用的、面向对象的、解释型的编程语言。Ruby最早是在1993年发布的。第一个发行的版本在1995年公之于众,并在20世纪90年代风靡日本。Ruby能够以相对少的代码完成较多事务,并且以优雅和视觉流畅的语法和风格著称,获得了许多赞誉。事实证明,Ruby在广泛的编程领域中,从服务器管理脚本到嵌入式设备集成,从Web开发到PDF文档处理,都是非常有用和高效的。此外,可能有人说Ruby编程技术性不强,但Ruby编程很有趣,它正是按这个思路设计的。正如松本行弘所说,Ruby为编程体验而优化。确实,因为许多程序员对松本行弘曾做过的同类语言的设计颇有好感,诞生于松本行弘“玩具项目”(pet project)的Ruby语言从一开始就获得了众多的关注。
关于Ruby的第一本英文书Programming Ruby(Dave Thomas和Andy Hunt)在2000年年底出版,并因此引领了一波日本之外学习Ruby的浪潮。自从“镐书”(Pickaxe book)(Thomas和Hunt编写的Programming Ruby的别名,源于书的封面插图)出版,Ruby在西方逐步普及。“镐书”第1版发行4年后,David Heinemeier Hansson发布了Ruby on Rails框架,并由此激发了全世界范围内学习Ruby的热情。自2004年以来,Ruby的使用率成指数倍增长,同时增长的还有Ruby的书籍、Ruby用户组以及Ruby相关的会议和其他活动。
我是一个Rails的开发者和爱好者。同时,我坚信,即使Rails从来没有出现过,Ruby最终也将被世界“发现”并达到目前Rails时代的规模。Ruby是一门令人非常愉悦和通用的语言,它将永远像拥有神秘面纱的宝石。我爱上Ruby已近乎14年了,我很高兴可以通过写作和教学将它介绍给许多人,并看到他们中的绝大多数也开心和满意地拥抱Ruby语言。
这就是我写这本书的初衷。本书的目的是让读者广泛和深入理解Ruby的工作机制和大量的Ruby技术工具,以及能在实际编程中使用的术语和习语。
本书的组织结构
本书第2版由15章组成,分为3个部分。
- 第一部分:Ruby语言基础。
- 第二部分:内置类和模块。
- 第三部分:Ruby动态编程。
第一部分(第1章至第6章)包含Ruby语法以及许多构建关键理念和语意的内容:对象、方法、类和模块、标识符和其他。本书也讲述了Ruby编程的生命周期(如何准备、执行代码文件,并写出调用多个文件的程序),同时还有Ruby支持的经常使用的许多命令行工具,包括:Ruby的交互式解释器(irb)、RubyGems包管理器(gem)和Ruby解释器(ruby)。
第二部分(第7章至第12章)深入讲解一些主要的内置类(build-in class),包括字符串、数组、散列、数值、范围对象、日期对象和时间对象,以及正则表达式,也让读者深入了解各种内置工具的用途,以及使用的具体细节。同时也在探索如下问题的过程中构建读者对Ruby的基础认知:Ruby中的布尔逻辑、用于转换对象(如转换字符串到整型)的内置方法、用于处理集合类型(collection)和枚举(enumeration)的许多机制,以及比较对象唯一性和相等性的技术。还可以学到关于文件操作和控制台输入输出(I/O)及Ruby程序内部调用系统指令的方法。
第三部分(第13章至第15章)阐述Ruby的动态特性。在这个主题之下存在着很多子议题:其中一些关于元编程技术,包括Ruby运行时反射和对象自省机制,以及赋予对象个性化行为的方式,还有函数、线程、其他可运行可执行对象的处理方法。本书的这一部分还介绍了从Ruby程序中调用系统指令的技术,包括Ruby中由事件触发的运行时钩子(hook)和回调(callback),如程序调用不存在的方法时和通过如类继承及方法定义时的拦截事件。
Ruby语言有完整的系统性,以严格的顺序阅读方式阐述这样的一个系统是一项挑战。撰写本书要应对的挑战是把学习过程看作是一个渐开螺旋,总是建立在熟悉的知识基础上但又对未知充满渴求。有时,读者要为将来的主题给出足够的留白,那样就能够把目前的主题学得更为深入。之后,当必要的知识已储备完成,就可以回到之前的留白去完成它。本书的设计是为了让读者获得尽可能多的素材,这一目标与真正掌握和持续理解语言的运行机制,从而打下坚实基础的目标一致。
本书的读者对象
本书第2版针对读者进行了优化,其读者对象是有过编程经验的,或许甚至是有过Ruby编程经验并想要学习更多Ruby语言编程技术的人。书中不仅有具体的技术(尽管书中包含的是大量的技术内容),而且也有构成Ruby的设计原理。我对读者的能力深信不疑,也确信读者不会每写一行代码都要在脑海中进行一次论证,而是会了解如何最大限度地理解编程语言,并且知道出现问题时如何分析。
对一些有针对性的读者,我需要正视一些问题,因为本书收录的一些入门性的专题和技术,对于有经验的开发者来说是很熟悉的。我尽力满足这部分读者的喜好,质疑的声音总是会很快出现,而我相信不时地用几句话解释一下术语,就可以让读者感觉到极为不同的舒适感和亲和力。假如读者是一个经验丰富的程序员,看了几页后发现这本书是填鸭式的,那么请原谅,毕竟我的初衷是好的。
同样的道理,如果读者是第一次涉足编程,准备主动地做一些额外的“家庭作业”,并以此获得编程能力的大幅提升,那么务必要尝试一下本书。本书没有专门介绍编程,而是让读者置身于实践之中,包括创建和运行程序文件,并从基础出发去阐述Ruby语言。
本书未包含的内容
本书第2版是一本重要的全方位关注Ruby语言的书,但它并不是一本完全的语言参考手册。有一些核心类(core class)很少提及或未提及,书中讨论的标准库的包数量有限,这是设计使然。读者并不需要本书详细地说明怎样使用每一个标准库API,我也不会这样做。在所有的可能中,读者可能需要的是有人可以准确地解释class << self的含义,或者为什么两个实例变量分写在两行却不是同样的变量,或者单例方法和私有方法之间的差别,还有什么是枚举器(enumerator)以及它和迭代器(iterator)的区别。读者需要知道上面所说的种种,也需要看到它们所起的作用并开始使用它们。当然,也有必要为了工作中使用Ruby而去深入地了解标准库,我确实鼓励这样做。我的目的是让读者对本书有着独特的和不同程度的理解。
关于Ruby的版本
本书第2版覆盖了Ruby语言2.1版本的内容,这也是写本书时的最新版本。Ruby 1.9版本仍然在广泛使用中,但我预测它将不会使用太长的时间。如果读者仍然在使用Ruby 1.9版本,也将会从书中得到很多有价值的信息,但在不远的将来有可能尝到Ruby 2的不同“风味”。
编码命名规范、示例和下载
在正文中,Ruby变量和常量的名称都使用等宽字体。当类和模块的名称表示直接引用现有类或模块的对象时,也使用等宽字体。例如,“下一步,我们将重新打开Person类定义块。”凡类和模块的名称用在更为狭义的地方,这个名称就使用正常字体,如“现在我们需要一个Array的实例”。不管在什么样的情况下,读者能够通过上下文,对本书中出现的类、模块及Ruby的其他实体的命名加以区分。
本书中示例所使用的源码可以从如下地址下载:www.manning.com/black3或者www.manning.com/TheWellGroundedRubyist-SecondEdition。
直接用于执行的程序和作为命令行的程序,如ruby和rails,它们的名称使用等宽字体。
斜体或星号用作通配符表达式。例如,to_*可能指向Ruby一般类型的方法,包括to_i和to_s,而position_match可能相应指向的方法却是post_match或者pre_match。
可以把书中的代码示例放到一个文本文件中,然后用ruby命令独立运行它们,也可以把它们输入交互式Ruby解释器(irb)中运行。在第1章中,会学到这些技术。随着对本书的深入阅读,我们将假定读者可以独立运行程序,书中若没有给过对文件名的建议(或者读者喜欢不同的名称),读者也可以为示例文件命名。
书中大量的例子都是以irb会话的形式展现的。读者在书中看到的代码,是在用irb运行代码的实时会话中剪切粘贴过来的,所以很容易辨认出这样的格式(特别是读者开始使用irb的时候)。这样的表达方式对于较短的代码片段和表达式来说尤其适合,并且无论读者输入什么(它甚至像是一个计算器),irb总是会输出执行的结果,这可以减少为了看到输出结果而使用print指令的次数。
在其他的代码示例中,代码的输出结果被安排在示例之后分别印刷,或者伴随代码示例印刷(清晰地标注为输出部分),或者嵌在代码段之后的叙述之中。
在一些示例旁会伴随出现标有数字的球形符号。这些球形符号关联到之后叙述的具体要点,并让读者可以在叙述中快速回查。
命令行程序的调用使用美元符号($)作为提示符,它通常是类UNIX环境中普遍使用的shell提示符。这些命令大多数可以在Windows上运行,只是提示符可能会不同(在所有的系统环境中,命令的可用性总是依赖于在系统环境变量中设置相对路径)。
尽管在其他领域中,我遵从W3C的指南使用“Web”,在这里我使用“Web”来表示万维网。
作者在线
购买本书第2版后,读者可以免费访问Manning出版社运营的私有Web论坛,在那里可以评论本书、咨询技术问题、得到作者和其他用户的帮助。访问论坛和订阅论坛,请浏览如下任意网站:
www.manning.com/TheWellGroundedRubyistSecondEdition
www.manning.com/black3
这个页面介绍了注册后如何访问论坛、可以得到什么帮助以及论坛上的行为规则。Manning承诺为读者之间、读者与作者之间提供一个可以对话的场所,但因作者在论坛上的贡献都是自愿的(不收费的),所以不会强制作者参与。为使作者感兴趣,提高其参与度,我们建议读者提一些具有挑战性的问题。
只要本书依然在售,读者就可以从出版社网站访问作者在线论坛(The Author Online forum)和之前讨论话题的存档文件。
关于封面图画
本书封面上的插画是一位法国贵族或者说是一个法国贵妇人。这张插画取自Sylvain Maréchal①在1805年印刷的关于地域服饰风俗的4部画卷纲要。这本书于1788年(即法国大革命前一年)在巴黎首次发布。每一张插画都手工上色。
Sylvain Maréchal色彩缤纷的图集唤醒我们对近200年前世界不同地域文化独立性的思考。他们曾彼此隔绝,人们说着不同的方言和语言。从乡下到市区,通过他们的着装很容易辨认出他们生活的地方、他们经营的生意以及身份。时过境迁,那时如此丰富的地域着装规范以及多样性已不复存在。现今就连不同的国家都很难从服饰上进行分辨,更不必说城市和地区了。或许,我们用文化的多样性换取了更为丰富多彩的个人生活,这无疑是一种更为多元化的,也是更为快节奏的科技生活。
现今,计算机图书层出不穷,Manning出版社用两个世纪之前富有多样性地域生活的插画作为书的封面,以此来庆祝IT行业日新月异的发明和创造力,并让Sylvain Maréchal的插画得以重现。
① Sylvain Maréchal(1750—1803):法国散文作家、诗人、哲学家。维基百科http://en.wikipedia.org/wiki /Sylvain_Mar %C3%A9chal。——译者注
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
目录
前言
第一部分 Ruby语言基础
第1章 进入Ruby的世界
1.1节进入Ruby的世界
1.2节剖析Ruby的安装
1.3节Ruby扩展和编程库
1.4节易用的Ruby工具和应用程序
1.5节小结
第2章 对象、方法和局部变量
第3章 使用类组织对象
第4章 模块和程序组织
第5章 默认对象(self)、作用域和可见性
第6章 控制流技术
第二部分 内置类和模块
第7章 内置要点
第8章 字符串、符号和其他标量对象
第9章 集合和容器对象
第10章 集合类型核心: Enumerable和Enumerator
第11章 正则表达式和基于正则表达式的字符串操作
第12章 文件和I/O操作
第三部分 Ruby动态编程
第13章 对象的个性化
第14章 可调用和可运行对象
第15章 回调、钩子和运行时自省
**
欢迎来到异步社区!
**