Metaprogramming Ruby

Paolo Perrotta

出版时间

2010-02-22

ISBN

9781934356470

评分

★★★★★
书籍介绍
这本书最打动人的地方,是它把元编程从'玄学'还原成了'学'。读者反复提到:作者将各种'刁钻'的技巧总结成规范模式,让混沌的世界变得泾渭分明——这种化繁为简的功夫本身就是最大价值。书中对对象模型、包含类、祖先链、lambda与proc差异的剖析,被公认'讲得很清楚',帮助读者真正理解Ruby'一门设计得很好的语言'。但争议也由此而来:有人觉得部分内容'给作者弄得那么长',读书时间被'浪费';也有人直言'内容不多',更推荐《Eloquent 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.
AI导读
核心看点
  • 以工作日冒险故事串联,生动讲解Ruby元编程核心概念。
  • 深入剖析对象模型、作用域及eigenclasses等底层机制。
  • 将晦涩技巧总结为规范模式,化繁为简,清晰有条理。
读者共识
  • 薄薄一本却讲透原理与应用,是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 程序中所有的语言构件在运行时可用。在运行一个程序时,无需翻过一道横越在所写程序和所运行程序中间的墙。这里只有一个世界。"
用户评论
好书,值得一度,俺的笔记: 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的其他书籍查看全部

求书
收藏