根本就没有元编程,从来就只有编程。
本书讲透了Ruby的对象模型,传授了操作语言构件的“法术”。
调用一个方法就是给一个对象发送消息。Ruby的关键在于理解当前对象(self),从而识别出上下文。
相较于Python,Ruby的优势在于:方法调用可以省略括号,可以省略self;调用方法时,可以定义代码块;混入“模块”,就能扩展现有类;有钩子方法,有“符号”这种类型。
文摘
元编程是编写能在运行时操作语言构件的代码。
任何以大写字母开头的引用(包括类名和模块名)都是常量,常量的路径用双冒号进行分隔。类本身是Class类的对象,Class类是Module的子类。
每次include或prepend一个模块时,如果该模块已经存在于祖先链中,那么Ruby会忽略这个包含指令。
如果调用方法的接收者不是自己,就必须明确指明接收者;私有方法只能通过隐性的接收者调用。
Ruby解释器会创建一个名为main的对象,即顶层上下文。在类和模块定义之中(且在任何方法定义之外),self的角色由这个类或模块本身担任。
每当程序进入(或离开)类定义、模块定义、方法时,就会发生作用域切换。代码块是闭包,不是对象。
一个对象的单件类的超类是这个对象的类;一个类的单件类的超类是这个类的超类的单件类。
法术手册
别名环绕,从一个重新定义的方法中调用原始的、被重命名的版本。
白板类,移除一个对象中的所有方法,以便把它们转换成幽灵方法。
类扩展,通过向类的单件类中加入模块来定义类方法,是对象扩展的一个特例。
类实例变量,在一个Class对象的实例变量中存储类级别的状态。
类宏,在类定义中使用类方法。
洁净室,使用一个对象作为执行一个代码块的环境。
代码处理器,处理从外部获得的代码字符串。
上下文探针,执行一个代码块来获取一个对象上下文中的信息。
延迟执行,在proc或lambda中存储一段代码及其上下文,用于以后执行。
动态派发,在运行时决定调用哪个方法。
动态方法,在运行时决定怎样定义一个方法。
动态代理,把不能对应某个方法名的消息转发给另一个对象。
扁平作用域,使用闭包在两个作用域之间共享变量。
幽灵方法,响应一个没有关联方法的消息。
钩子方法,覆写一个方法来截获对象模型事件。
内核方法,在Kernel模块中定义一个方法,使得所有对象都可使用。
惰性实例变量,等第一次访问一个实例变量时才对它进行初始化。
拟态方法,把一个方法伪装成另一种语言构件。
猴子补丁,修改已有类的特性。
命名空间,在一个模块中定义常量,以防止命名冲突。
空指针保护,用“或”操作符覆写一个空引用。
对象扩展,通过给一个对象的单件类混入模块来定义单件类方法。
打开类,修改已有的类。
下包含包装器,调用一个用prepend方式覆写的方法。
细化,为类打补丁,作用范围仅到文件结束,或仅限于包含模块的作用域中。
细化封装器,在细化中调用非细化的方法。
沙盒,在一个安全的环境中执行未授信的代码。
作用域门,用class、module或def关键字来隔离作用域。
Self Yield,把self传给当前代码块。
共享作用域,在同一个扁平作用域的多个上下文中共享变量。
单件方法,在一个对象上定义一个方法。
代码字符串,执行一段表示Ruby代码的字符串。
符号到Proc,把一个调用单个方法的块转换为一个符号。