from:《Ruby 元编程》书评
Ruby 确实是完全面向对象的,而且,它在语义上更为纯粹。Ruby 可以用自身的代码完整的解释自己的对象模型,包括核心的基础类和方法。设计 Ruby 语言,包含了设计它核心的对象和对象方法,这在现代的编程语言中是常见的,但是 Ruby 做的特别彻底和优美, Ruby 很好的继承和发扬了 Smalltalk 的思想,它对面向对象模型的抽象,就像 Lisp 对程序语言的抽象一样彻底。
Ruby 的对象模型中,对象、类、本体类(Eigenclass)、作用域、消息、self 等重要概念, 和它们的实用意义,都在本书得到了阐述。
Ruby 有严格完整的作用域限制(class,module,def充当"作用域门"),在本书中有详细讨论,包括不同作用域之间如何互相隔离,又如何在它们之间传递信息。 基于作用域,衍生出了 block ,然后是 lambda 和 proc 的使用、原理、区别。
扁平化作用域、洁净室、闭包等概念,都在实例中讲解清楚,了解 yield 和 nolocal 等知识。
书中还讨论了类和模块的区分。
Ruby 有 eval、instance_eval、class_eval 三个不同的eval函数,它们可以接收字符串或代码块, 这比 Python 的 eval 要复杂,但是从理论高度理解,就会发现它们相当的严谨和简洁。 这些方法可以帮助我们构造或访问特定的作用域,或许会让 Python 程序员想到 yield 的使用。而 Objective C 也已经加入了很多 block 支持。
Perl 的 eval 经常用于异常处理,本书也讨论了 Ruby 的一些异常处理技巧。
提到异常处理,文中专门有一个例子模拟了 C# 的 using 关键字,这个关键字曾经是我面试 C# 程序员时的考题内容。将这个例子稍加扩展,就可以编写一个类似 Python 2.7 中多参数 with 的实现。
Ruby 引入了 Eigenclass 概念,它优雅的解决了 duck typing 和对象类型之间的矛盾。 instance_eval , class_eval 和 method_missing 等方法,组成了 Ruby 的动太对象操作集。它们使得 Ruby 在类型约束和动态对象之间游走自如。 相对于 Python 的 duck typing 风格和 Java 的静态约束,Ruby 更为平衡, 允许用户自己选择约束与自由的平衡点。相对于在 Java 中使用反射或 Python 中使用约束,Ruby 无论倾向哪一种风格,都不会付出太高昂的编程代价。
学习这部分知识时需要注意的时,Ruby 中的单件(Singleton)不代表通常意义的单例模式, 而是通常说的动态对象,即 duck typing。
类型混入(MixIn)在 Python 中也是重要的元编程技巧,著名的 Python 编辑器 Ulipad 就大量使用了这种技术。Ruby 对 Mixin 的支持更漂亮,也更灵活,这个技术在书中反复使用。
Ruby 同样继承了 Smalltalk 的 extend(这里指 Smalltalk 的 extend , Ruby 的 extend 则表示了不同的含义) 方法,这个技巧在本书一开始就有介绍,并且反复使用。
Objective C 虽然没有 Ruby 这样丰富完整的面向对象语义(相对来说,objective c拥有 C 级别的运行效率和底层访问能力),但是学习 Ruby 的各种类型扩展技术, 可以帮助我们更好的理解和运用 Objective C 中的 category 等技术。
对文本直接 Eval 当然非常灵活,特别是 Ruby 具有 Perl 和 PHP 的变量内插能力, 但是它也有其缺陷,书中详细讨论了这个问题,介绍了一些应对方法。LISP 程序员相信会注意到 Ruby 有在符号和文本之间进行转换的能力,这就像 LISP 宏和 Python 自省的结合,好吧,Ruby 也有自省,而且更强大。
Objective C 程序员也可以从中增强对 SEL 和 @selector 等概念的理解。
本书中多次使用的类宏,不同于 LISP 的宏,虽然它也是一种生成技术。这一点 LISP 程序员不要简单代入。在我看来, LISP 宏与 Ruby 类宏的差异,比它与 CPP Template 的差异更大。
属性封装、访问器等概念在多种语言中都有体现,本书用 Ruby 的各种内置方法和设计方法, 向我们展示了这些概念在语义上到底是如何被设计和理解的。学到这些知识,对 Python、 和 C# 等领域的程序员,理解日常工具中出现的 property 技术,也有很大帮助。
深入阅读 method_missing 相关的知识,不仅可以了解 Ruby 的动态属性和方法技术, 还可以帮助我们深入了解为何 Smalltalk 观点中的对象是消息驱动, 而非表面看来简单的函数执行。Objective C程序员也可以借此更好的理解 KVO、KVA 等技术。
阅读本书对于编程语言控、设计方法控,是莫大的享受,即使我这个从来没有实用过 Ruby 的门外汉,也感到了不能自拔的愉悦。我这里只是凭印象选择了一些让我激动的点来介绍。 书中的精彩,只有自己去阅读才能体验。
除了方法讲解和生动的故事实例,本书还穿插介绍了很多 Ruby 的第三方资源, 包括著名的 ROR。
尽管读完这本书以后,或许你也像我一样对 Ruby 产生了浓厚的兴趣,但是我要提醒本文的读者, 不要误认为 Ruby 是解决一切问题的完美方案。Freedom 不是无代价的, Smart 同样不是无代价的。 Ruby 强大、优美、完备的语言设计,需要付出很高的性能代价。
相对来说,尽管我不断的在文中提及 Python 比之 Ruby 的模型,如何简陋,但 Python 的确有性能优势,它剪裁了 Smalltalk 理论中的一部分,通过建立在 C 语言环境上的字典模型实现出来。这使得它的动态模型非常容易理解,并非像 Ruby 这样充满了魔幻和神秘感。而且 Python 代码很容易获得更高的性能。尽管 Ruby 的近几个版本在性能方面有了长足的进步,但是 Python 仍然远远的将其抛在后面。前有 Bigworld、 EVE、stackless Python,后有 Torando 这样的高性能应用,充分证明了 Python 作为架构级技术,在性能方面有足够优秀的表现。恰到好处的语言设计, 也使得它在开发效率上,仍处于最优秀的几种语言之列。
对于喜欢脑力风暴的 GEEK 程序员,即使有了 Ruby ,也不等于其它语言就不值得学习和使用。性能、 表现形式,或特定领域的突出表现,都会促使我们做出选择。例如 Perl 的锋利,LISP 的美感, LUA 的轻捷。但是无论你是哪一种语言的使用者,只要你对面向对象、动态模型或编程有兴趣, 我都诚挚的向你推荐这本Ruby元编程。