元编程不过是编程——经典必读

作用域(绑定)

改变作用域的关键字, 分别是module,class和def。我们称为作用域的门(scope gate)

instance_eval以实例作用域执行代码
class_eval以类定义作用域执行代码
Kernel#eval方法,当前上下文中直接执行代码字符串

instance_eval class_eval
对象 单例方法 --
类名(元类对象) 类方法 实例方法

表格是不精准、不完备的表达,instance_eval、class_eval使用时需要注意区分调用对象

打破作用域门的方式

  • 类定义使用 Class.new 替换
  • 模块定义使用 Module.new 替换
  • 方法定义使用 define_method 替换

对象模型图

七条规则

  1. 只有一种对象——要么是普通对象,要么是模块
  2. 只有一种模块——可以是一个普通模块、一个类或者一个单件类
  3. 只有一种方法,它存在于一个模块中——通常是在一个类中
  4. 每个对象(包括类)都有自己的“真正的类”——要么是一个普通类,要么是一个单件类
  5. 除了BasicObject类没有超类外,每个类有且只有一个祖先——要么是一个类,要么是一个模块。这意味着任何类只有一条向上的、直到BasicObject的祖先链。
  6. 一个对象的单件类的超类是这个对象的类;一个的单件类的超类是这个类的超类的单件类
  7. 调用一个方法时,Ruby先向右迈一步,进入接收者真正的类,然后向上进入祖先链。这就是Ruby查找方法的方式

法术手册

  • 环绕别名:加一层包装,A => A-B-_A
  • 白板类:移除一个类的所有方法,以便把它们转换为幽灵方法
  • 类扩展:通过向类的单件类中加入模块定义类方法,是对象扩展的一个特例
  • 类实例变量:Class对象的实例中存储类级别的状态
  • 类宏:在类定义中使用方法
  • 洁净室:使用一个对象作为执行一个代码块的环境Cleanroom.new.instance_eval{fun()}
  • 代码处理器:处理从外部获得的代码字符串
  • 上下文探针:执行一个代码块来获取一个对象上下文中的信息
  • 延迟执行:在proc和lambda中存储一段代码及其上下文,用于以后执行
  • 动态派发:在运行时决定调用哪个方法
  • 动态方法:在运行时决定怎样定义一个方法
  • 动态代理:把不能对应某个方法名的消息转发给另外一个对象
  • 扁平作用域:
  • 幽灵方法:响应一个没有关联方法的消息
  • 钩子方法:覆写一个方法来截获对象模型事件
  • 内核方法:在Kernel模块中定义一个方法,使得所有对象都可使用
  • 惰性实例变量:等第一次访问时才进行初始化@a ||= "str"
  • 拟态方法:把一个方法伪装成另外一个语言构件
  • 猴子补丁:修改已有类的特性
  • 命名空间:在一个模块中定义常量,以防止命名冲突
  • 空指针保护:x=nil;y = x || 'str'
  • 对象扩展:通过给一个对象的单件类混入模块来定义单件方法
  • 打开类:修改已有的类
  • 下包含包装器:调用一个用prepend方式覆写的方法
  • 细化:refine为类打补丁,作用范围仅到文件结束或模块作用域
  • 细化封装器:在细化中调用非细化的方法
  • 沙盒:$SAFE在一个安全环境中执行未授信代码
  • 作用域门:class、def、module
  • Self Yield:把self传给当前代码块
  • 共享作用域:在同一个扁平作用域的多个上下文中共享变量
  • 单件方法:在一个对象上定义一个方法
  • 代码字符串:
  • 符号到Proc:把一个调用单个方法的块转换为一个符号

201707《Ruby元编程》的更多相关文章

  1. 3-8《Ruby元编程》第二章对象模型

    <Ruby元编程> 第二章 对象模型 类定义揭秘inside class definitions: class关键字更像一个作用域操作符,核心作用是可以在里面随时定义方法. [].meth ...

  2. 3-11 《Ruby元编程》第4章block块 3-12

    第4章代码块blocks 基础知识 作用域:用代码块携带variables through scopes 通过传递block给instance_eval方法来控制作用域. 把block转换为Proc, ...

  3. Ruby元编程:动态添加类属性及其实际应用

    上个星期测试道的Monkey老师和我聊到测试用例参数过多的问题,其实这样的问题在我这里也同样经历过.比如我的测试用例必须面对不同的测试环境,每个环境有无数的参数,开发的最初阶段,因为参数少,所以就放在 ...

  4. Ruby元编程:单元测试框架如何找到测试用例

    前几天看了Google Testing Blog上的一篇文章讲到C++因为没有反射机制,所以如何注册测试用例就成了一件需要各显神通的事情.从我的经验来看,无论是Google的GTest还是微软的LTM ...

  5. ruby 元编程

    一 对象模型 kernel Module Kernel.private_instance_methods.grep(/^pr/)   private method 1 如果一个方法接收者不是你自己,一 ...

  6. 3-18/19 (自我练习)30多个《Ruby元编程》的spell(pattern)小例子。

    Spell,也称pattern,idiom # Around Alias:从一个重新定义的方法中调用原始的,被重命名的版本. # old_reverse是未改变的原始方法,reverse/new_re ...

  7. Ruby元编程:执行某个目录下的全部测试用例

    目前手里有个测试项目各个feature的测试用例都放在对应的子目录下,虽然有自动化测试框架的帮助执行起来很方便,但是偶尔也有需要在本地执行某个feature的全部测试用例集合.因为本人对shell脚本 ...

  8. 201706 Ruby 基础 & 元编程

    yield yield self Proc yield带参数 rails中:yield 和 content_for methods.proc.lambda.block 闭包(用proc延长变量的生命周 ...

  9. Groovy元编程简明教程

    同函数式编程类似,元编程,看上去像一门独派武学. 在 <Ruby元编程>一书中,定义:元编程是运行时操作语言构件的编程能力.其中,语言构件指模块.类.方法.变量等.常用的主要是动态创建和访 ...

随机推荐

  1. linux动态监控dstat&&glances&&psutil&&bottle

    安装dstat yum install dstat 安装glances yum install python-devel pip install glances 如果我们安装了 Bottle 这个 w ...

  2. 折腾前端条形码(Barcode)扫描识别, 笔记

    barcode @zxing/library 方案 本地勉强把 Demo 在 React 里面跑通, 但是不好控制开始结束, API 不明确.实际识别率很低. 我是用手机屏幕放的条形码, 大概也有影响 ...

  3. unity优化-内存(网上整理)

    内存优化内存的开销无外乎以下三大部分:1.资源内存占用:2.引擎模块自身内存占用:3.托管堆内存占用.在一个较为复杂的大中型项目中,资源的内存占用往往占据了总体内存的70%以上.因此,资源使用是否恰当 ...

  4. pta 7-1 找出不是两个数组共有的元素

    给定两个整型数组,本题要求找出不是两者共有的元素. 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔. 输出格式: 在一行中按照数字给出的顺序 ...

  5. Linux环境查看Java应用消耗资源情况

    linux线上资源耗时定位 https://www.cnblogs.com/wuchanming/p/7766994.html 1. jps -ml 查看服务器上运行的Java程序 2. jmap 查 ...

  6. 【原】Web Polygraph 安装

    1.下载 # wget http://www.web-polygraph.org/downloads/srcs/polygraph-4.3.2-src.tgz 2.解压 # tar zxvf poly ...

  7. 科普:为什么 String hashCode 方法选择数字31作为乘子

    作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...

  8. node.js是什么,node.js创建应用

    简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.Node.js是一个事件驱动I/O服务端Java ...

  9. CSS文本居中显示

    因为一直为元素居中问题而困扰,所以决定把自己遇到和看到的方法记录下来,以便以后查看 如果要让inline或inline-block元素居中显示,则父元素css中包含text-align:center; ...

  10. LauUI 的学习

    LayUI学习笔记 layer laydate layui 学习新技术方法:学习一个新技术,要去把它的文档通读一遍,不管你能不能读明白,就算你不明白也大概能知道它是怎么回事了,一回生二回熟,多读几遍, ...