前 言
学习一门新的编程语言通常需要经过两个阶段。第一阶段是学习这门编程语言的语法和结构。如果我们具有其他编程语言的经验,这个阶段通常只需要很短的时间。以Ruby为例,接触过其他面向对象语言的程序员对Ruby的语法也会比较熟悉。有经验的程序员对于语言的结构(如何根据语法构建应用程序)是很熟悉的。
在第二阶段则需要更多的努力。这个阶段也是你深入语言、学习语言风格的时候,许多编程语言在解决常见的问题时都使用了独一无二的方法,Ruby也不例外。比如循环,Ruby没有使用显式循环体来实现,而是使用了代码块和迭代器模式。学习如何突破思维定势,用Ruby的方式解决问题是这个阶段的精髓。
本书也将致力于编程语言学习的两个阶段。但本书并不是一本编程语言的入门级书籍。如果你已经完成了第一阶段,即语法和结构的学习,通过本书你将会对Ruby的理解更加深入和全面,编写出更具可读性、可维护性的代码。在这个过程中,我也会介绍Ruby解释器的内部工作原理,并分享编写更高效程序的相关知识。
Ruby的不同实现和不同版本
如你所知,Ruby有一批非常活跃的社区贡献者。他们负责各种各样的项目,其中也包括Ruby解释器的不同实现。除了大家熟知的Ruby官方实现(MRI),我们也有很多其他的选择。想把Ruby应用程序部署到已配置Java环境的机器?没问题,这就是JRuby的用武之地。那Ruby应用程序是否支持智能手机和平板电脑呢?当然,同样也有一款相应的实现。
可以选择的Ruby实现有多种,这也证明了Ruby的活跃性。虽然每种的内部实现都不一样,但对Ruby程序员来说无需太过担心,因为这些解释器的行为和官方的MRI很接近。
本书介绍的很多方法在不同Ruby实现上都是通用的,但也有一些只针对MRI版本,诸如书中提及的垃圾回收机制。本书中指定Ruby特定版本的时候,都是针对MRI版本的。
书中所有代码适用于Ruby 1.9.3及其后的版本。在本书编写时,Ruby最新版本是2.1,Ruby 2.2即将面世。若书中未提及特定的Ruby版本,则示例代码可在所有支持的版本上运行。
关于代码风格的注释
目 录
第1章 让自己熟悉Ruby
第1条:理解Ruby中的True
第2条:所有对象的值都可能为nil
第3条:避免使用Ruby中古怪的Perl风格语法
第4条:留神,常量是可变的
第5条:留意运行时警告
第2章 类、对象和模块
第6条:了解Ruby如何构建继承体系
第7条:了解super的不同行为
第8条:初始化子类时调用super
第9条:提防Ruby最棘手的解析
第10条:推荐使用Struct而非Hash存储结构化数据
第11条:通过在模块中嵌入代码来创建命名空间
第12条:理解等价的不同用法
第13条:通过"<=>"操作符实现比较和比较模块
第14条:通过protected方法共享私有状态
第15条:优先使用实例变量而非类变量
第3章 集合
第16条:在改变作为参数的集合之前复制它们
第17条:使用Array方法将nil及标量对象转换成数组
第18条:考虑使用集合高效检查元素的包含性
第19条:了解如何通过reduce方法折叠集合
第20条:考虑使用默认哈希值
第21条:对集合优先使用委托而非继承
第4章 异常
第22条:使用定制的异常而不是抛出字符串
第23条:捕获可能的最具体的异常
第24条:通过块和ensure管理资源
第25条:通过临近的end退出ensure语句
第26条:限制retry次数,改变重试频率并记录异常信息
第27条:throw比raise更适合用来跳出作用域
第5章 元编程
第28条:熟悉Ruby模块和类的钩子方法
第29条:在类的钩子方法中执行super方法
第30条:推荐使用def?ine_method而非method_missing
第31条:了解不同类型的eval间的差异
第32条:慎用猴子补丁
第33条:使用别名链执行被修改的方法
第34条:支持多种Proc参数数量
第35条:使用模块前置时请谨慎思考
第6章 测试
第36条:熟悉单元测试工具MiniTest