Metaprogramming Ruby - Paolo Perrotta

Metaprogramming Ruby

Paolo Perrotta

出版时间

2010-02-22

ISBN

9781934356470

评分

★★★★★
书籍介绍
Everyone in the Ruby world seems to be talking about metaprogramming--how you can use it to remove duplication in your code and write elegant, beautiful programs. Now you can get in on the action as well. This book describes metaprogramming as an essential component of Ruby. Once you understand the principles of Ruby, including the object model, scopes, and eigenclasses, you're on your way to applying metaprogramming both in your daily work and in your fun, after-hours projects. Learning metaprogramming doesn't have to be difficult or boring. By taking you on a Monday-through-Friday workweek adventure with a pair of programmers, Paolo Perrotta helps make mastering the art of metaprogramming both straightforward and entertaining.
AI导读
核心看点
  • 以工作日冒险故事串联,生动讲解Ruby元编程核心概念。
  • 深入剖析对象模型、作用域及eigenclasses等底层机制。
  • 将晦涩技巧总结为规范模式,化繁为简,清晰有条理。
适合谁读
  • 已能完成Ruby项目,需深入理解语言底层机制的开发者。
  • 希望掌握元编程技巧,编写优雅代码的Ruby程序员。
  • 对Ruby对象模型及动态特性感兴趣的中高级技术读者。
读前提醒
  • 非入门书,建议先掌握Ruby基础语法后再阅读此书。
  • 建议结合irb边学边练,动手验证每个技术点加深理解。
  • 部分章节较深,需耐心反复阅读,配合源码分析更佳。
读者共识
  • 薄薄一本却讲透原理与应用,是Ruby元编程必读经典。
  • 翻译流畅,逻辑清晰,让读者豁然开朗,阅读体验极佳。
  • 虽篇幅不长,但内容精炼,被誉为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 has more than ten years of experience as a developer and writer. He worked for domains ranging from embedded to enterprise software, computer games, and web applications. These days, Paolo coaches agile teams for Yoox, a large Internet fashion shop, and teaches Java to developers throughout Europe. He lives in Bologna, Italy, with his girlfriend and a cat. He loves Ruby.
用户评论
好书,值得一度,俺的笔记: http://blog.yxwang.me/blog/notes/programming/metaprogramming-ruby.html
居然出中文版了
很舒畅
蛮不错,简洁明了,看了 Part 1 的 90% 和 Part 2 的 30% ,收获不小。 相较于 Python , Ruby 的设计更加 OO 也更加 functional 。个人角度上, Ruby 是我深入了解过的语言中最喜欢的语言之一。此书之于 Ruby ,相当于为初学者在 Ruby 纷繁迷乱的 magic 语言特森林中,画了一幅寻宝图。给四星是因为此书到底还是不如 sicp 和 on lisp 给我的震撼和启发更大。
:无
接触到Meta编程的思考。 后边才有了Python中的__missing__的使用。 才有了JS里,动态创建key。 才有了对LISP的囫囵吞枣。 才有了对scheme的试用。
两年前读过了,帮助自己系统建立了ruby基本知识。
再读一遍
A programming book that doesn't affect the way you think about programming, is not worth reading 😬😬😬
抽象之Ruby
Pragmatic Bookshelf的其他书籍查看全部

收藏