Ruby元编程

根本就没有元编程,从来就只有编程。

本书讲透了Ruby的对象模型,传授了操作语言构件的“法术”。

调用一个方法就是给一个对象发送消息。Ruby的关键在于理解当前对象self),从而识别出上下文。

相较于PythonRuby的优势在于:方法调用可以省略括号,可以省略self;调用方法时,可以定义代码块;混入“模块”,就能扩展现有类;有钩子方法,有“符号”这种类型。

文摘

元编程是编写能在运行时操作语言构件的代码。

任何以大写字母开头的引用(包括类名和模块名)都是常量,常量的路径用双冒号进行分隔。类本身是Class类的对象,Class类是Module的子类。

每次includeprepend一个模块时,如果该模块已经存在于祖先链中,那么Ruby会忽略这个包含指令。

如果调用方法的接收者不是自己,就必须明确指明接收者;私有方法只能通过隐性的接收者调用。

Ruby解释器会创建一个名为main的对象,即顶层上下文。在类和模块定义之中(且在任何方法定义之外),self的角色由这个类或模块本身担任。

每当程序进入(或离开)类定义、模块定义、方法时,就会发生作用域切换。代码块是闭包,不是对象。

一个对象的单件类的超类是这个对象的类;一个类的单件类的超类是这个类的超类的单件类。

法术手册

  • 别名环绕,从一个重新定义的方法中调用原始的、被重命名的版本。

  • 白板类,移除一个对象中的所有方法,以便把它们转换成幽灵方法

  • 类扩展,通过向类的单件类中加入模块来定义类方法,是对象扩展的一个特例。

  • 类实例变量,在一个Class对象的实例变量中存储类级别的状态。

  • 类宏,在类定义中使用类方法。

  • 洁净室,使用一个对象作为执行一个代码块的环境。

  • 代码处理器,处理从外部获得的代码字符串

  • 上下文探针,执行一个代码块来获取一个对象上下文中的信息。

  • 延迟执行,在proclambda中存储一段代码及其上下文,用于以后执行。

  • 动态派发,在运行时决定调用哪个方法。

  • 动态方法,在运行时决定怎样定义一个方法。

  • 动态代理,把不能对应某个方法名的消息转发给另一个对象。

  • 扁平作用域,使用闭包在两个作用域之间共享变量。

  • 幽灵方法,响应一个没有关联方法的消息。

  • 钩子方法,覆写一个方法来截获对象模型事件。

  • 内核方法,在Kernel模块中定义一个方法,使得所有对象都可使用。

  • 惰性实例变量,等第一次访问一个实例变量时才对它进行初始化。

  • 拟态方法,把一个方法伪装成另一种语言构件。

  • 猴子补丁,修改已有类的特性。

  • 命名空间,在一个模块中定义常量,以防止命名冲突。

  • 空指针保护,用“或”操作符覆写一个空引用。

  • 对象扩展,通过给一个对象的单件类混入模块来定义单件类方法。

  • 打开类,修改已有的类。

  • 下包含包装器,调用一个用prepend方式覆写的方法。

  • 细化,为类打补丁,作用范围仅到文件结束,或仅限于包含模块的作用域中。

  • 细化封装器,在细化中调用非细化的方法。

  • 沙盒,在一个安全的环境中执行未授信的代码。

  • 作用域门,用classmoduledef关键字来隔离作用域。

  • Self Yield,把self传给当前代码块。

  • 共享作用域,在同一个扁平作用域的多个上下文中共享变量。

  • 单件方法,在一个对象上定义一个方法。

  • 代码字符串,执行一段表示Ruby代码的字符串。

  • 符号到Proc,把一个调用单个方法的块转换为一个符号。