Ruby元编程(第2版) - [意] Paolo Perrotta

Ruby元编程(第2版)

[意] Paolo Perrotta

出版时间

2015-08-01

ISBN

9787568009799

评分

★★★★★
书籍介绍
《Ruby元编程(第2版)》在大量剖析实例代码的基础上循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby类库的实现细节,作者不仅向读者展示了元编程的优势及其解决问题的方式,更详细列出33种发挥其优势的编程技巧。本书堪称动态语言设计模式。Ruby之父松本行弘作序推荐。
AI导读
核心看点
  • 剖析Ruby对象模型与元编程核心原理
  • 详解33种实用编程技巧与动态语言特性
  • 揭示类、模块、Proc等底层实现机制
适合谁读
  • 希望深入理解Ruby底层机制的开发者
  • 对动态语言设计与元编程感兴趣的程序员
  • 寻求提升代码灵活性与可读性的Rubyer
读前提醒
  • 非入门书,需具备Ruby基础语法知识
  • 建议结合IRB环境边读边实践验证
  • 可对比JavaScript等语言理解元编程
读者共识
  • 干货满满,被誉为最好的Ruby书籍之一
  • 图文并茂,深入浅出,阅读体验极佳
  • 读完能更新对编程世界观的认知理解

本导读基于书籍简介、目录、原文摘录、短评和书评生成,不等同于全文精读。

精彩摘录
  • "Module#constants方法返回当前范围内的常量; Module.constants方法返回当前程序中所有顶级常量; 使用load() 方法有一个副作用。motd.rb 文件很可能定义了变量和类。尽管变量在加载完成后会落在当前作用域之外,但常量不会。这样,motd.rb 可能会通过它的常量(尤其是类名)污染当前程序的命名空间。 可以通过使用第二个可选参数来强制其常量仅在自身范围内有效:load('motd.rb', true) 通过这种方式加载的文件,Ruby 会创建一个匿名模块,使用它作为命名空间来容纳motd.rb 中定义的所有常量,加载完成后,该模块会被销毁。 require()"
  • "当你在一个类(甚至可以是另外一个模块)中包含(include)一个模块时,Ruby 耍了些小花招。Ruby 创建了一个封装该模块的匿名类,并把这个匿名类插入到祖先链中,其在链中的位置正好包含在它的类上方。 就在Bill画着图1.7 的时候,他还解释说这些“封装(wrapper)”类叫做包含类(include class),有时也叫做代理类(proxy class)。包含类是Ruby 的一个秘密,superclass() 方法会假装它们根本不存在,而且你也一般不能通过正常的Ruby 代码访问它们。不过,还是应该对此有所了解,至少它能帮助理解有很多模块的复杂类体系结构。"
  • "由于Book没有明确指定的超类,所以它隐式继承于Object,而Object类包含Kernel模块并继承于BasicObject。当Book类包含Document模块时,Ruby为Document模块创建了一个包含类,并把它加入到Book类的祖先链上,位置正好在Book类之上。紧接着,Book类又包含Printable模块,再一次,Ruby为Printable模块创建了一个包含类,并把它也加入到Book的祖先链上,位置还正好在Book类之上,这样祖先链从Document往上的其他成员,则顺次提高一位。"
  • "使用lambda()创建的Proc称为lambda,而使用其他方式创建的则简单称为proc。 lambda和proc的return关键字各有不同的含义,这是它们的第一个区别。在lambda中,return仅仅表示从这个lambda中返回:"
  • "在proc中,return的行为则有所不同。它不是从proc中返回,而是从定义proc的作用域中返回:"
  • "proc和lambda的第二个区别来自它们检查参数的方式……lambda的适应能力比proc以及普通的块差。如果调用lambda时的参数数量不对,则它会失败,同时会招聘一个ArgumentError错误;而proc则会把传递进来的参数调整为自己期望的形式:如果参数比期望的要多,那么proc会忽略多余的参数;如果参数数量不足,那么对未指定的参数,proc会赋予一个nil值。 在Ruby1.8中,Kernel#proc()实际上只是Kernel#lambda()的别名。由于程序员的不断抗议,在Ruby1.9中,proc()变成Proc.new的别名。"
  • "当使用irb时,可以打开一个嵌套会话,并指定一个对象作为它的上下文,这样就可以在这个上下文中执行代码,就像instance_eval()方法所做的那样。可以这样来使用irb 命令:"
  • "一个用C语言写的程序会跨越两个世界:编译时和运行时。……由于绝大多数编译时的信息在运行时都丢失了,所以 C 语言不支持元编程或内省。在 C++ 中,一些语言构件可以在编译后生存下来,这也是为什么你可以向 C++ 对象询问它的类的原因。……没有编译时,Ruby 程序中所有的语言构件在运行时可用。在运行一个程序时,无需翻过一道横越在所写程序和所运行程序中间的墙。这里只有一个世界。"
作者简介
Paolo Perrotta 有超过15年的软件设计和开发经验,他开发过嵌入式软件、企业级软件、计算机游戏和web应用,还发表过上百篇技术文章。他在欧洲各国教授敏捷课程,过着游牧般的生活。
Z-Library
收藏