从今天开始,我将陆续在这里复制别人翻译好的书。这是很无耻的一件事,但是为了流量。我就无耻一把了。翻译者如果看到本文,有权利要求我删除相关内容。希望你们看不到。
********************************* 我 是 分 割 线 *********************************
Rails 使元编程变得大众化。虽然它肯定不是第一个利用Ruby的广泛功能进行内省(introspection)的应用,但它却很可能是最受欢迎的Ruby应用。为了理解Rails,我们必须首先搞清楚Ruby中使Rails的实现变为可能的那些部分。本章介绍了后文中讨论的技术的基础。
元编程是一种使用代码来编写其它代码以及进行自省的编程技术。Meta(源于希腊语)这个前缀在这里的意思是抽象。使用了元编程技术的代码在两个抽象层次上同时进行工作。
元编程技术在多种编程语言中都可以使用,但更多的还是被应用于动态语言中,因为动态语言提供了更多的在运行时将代码视为数据进行操纵的能力。虽然像C#和Java这样较为静态的语言也提供了反射机制,但是仍然没有诸如Ruby这样的更趋动态性的语言那么透明,这是因为静态语言在运行时其代码和数据是分布在两个层次上的。
自省通常是在这两个层次上的某一个层上完成的。语法层的自省是最底层的——直接检查程序文本或者符号流。基于模板和基于宏的元编程一般来说都是在语法层进行的。
Lisp 通过既可以用于代码也可以用于数据的S表达式(本质上是程序抽象语法树的直接翻译)支持语法层的元编程。Lisp的元编程大量的使用了宏,宏的本质是代码模板。Lisp的这种方式带来的好处是可以在单一的层次上进行编程,代码及数据都以相同的方式表现,唯一的区别在于是否会被估值(evaluate)。然而语法层的元编程模式也有其弊端,用在同一命名空间下运行和估值的代码对两个抽象层次进行操作,会直接导致变量捕获(Variable Capture)和不经意的多次估值这类问题的出现。纵使有标准的Lisp惯用法可以处理这些问题,Lisp程序员仍然是需要学习和考虑更多的东西。
Ruby可以通过ParseTree库来完成语法层的自省,ParseTree可以将Ruby源代码翻译成S表达式。使用此库来编写的一个有趣的应用叫做Heckle,它是一个“测试的测试”框架,能够对Ruby代码解析及改变,例如改变字符串或者将‘true’和‘false’进行来回的调换。其想法是如果测试覆盖率很好,那么对代码任何部分的任何变更都应该导致单元测试的失败。
与语法自省相对应的一种更高层次的自省叫做语义自省,既通过语言更高层次的数据结构对程序进行探查。在不同的编程语言中语义自省的方式十分不同,在Ruby语言中一般来说都是作用于类及方法层上:创建方法,重写方法,给方法赋予别名(alias);截取方法调用;操纵继承链。这些技术和语法层自省相比与已有的代码更为正交(相关度更小),因为它们倾向于将已存在的方法视为黑盒而不是修改其内部实现。


















请问你帖的书是什么书,有没下载地址?
好像是一些文章的简要翻译,整理出来的。一个朋友写的,被我拿来帖了。