201707《Ruby元编程》
元编程不过是编程——经典必读
作用域(绑定)
改变作用域的关键字, 分别是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 替换
对象模型图

七条规则
- 只有一种对象——要么是普通对象,要么是模块
- 只有一种模块——可以是一个普通模块、一个类或者一个单件类
- 只有一种方法,它存在于一个模块中——通常是在一个类中
- 每个对象(包括类)都有自己的“真正的类”——要么是一个普通类,要么是一个单件类
- 除了BasicObject类没有超类外,每个类有且只有一个祖先——要么是一个类,要么是一个模块。这意味着任何类只有一条向上的、直到BasicObject的祖先链。
- 一个
对象的单件类的超类是这个对象的类;一个类的单件类的超类是这个类的超类的单件类; - 调用一个方法时,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元编程》的更多相关文章
- 3-8《Ruby元编程》第二章对象模型
<Ruby元编程> 第二章 对象模型 类定义揭秘inside class definitions: class关键字更像一个作用域操作符,核心作用是可以在里面随时定义方法. [].meth ...
- 3-11 《Ruby元编程》第4章block块 3-12
第4章代码块blocks 基础知识 作用域:用代码块携带variables through scopes 通过传递block给instance_eval方法来控制作用域. 把block转换为Proc, ...
- Ruby元编程:动态添加类属性及其实际应用
上个星期测试道的Monkey老师和我聊到测试用例参数过多的问题,其实这样的问题在我这里也同样经历过.比如我的测试用例必须面对不同的测试环境,每个环境有无数的参数,开发的最初阶段,因为参数少,所以就放在 ...
- Ruby元编程:单元测试框架如何找到测试用例
前几天看了Google Testing Blog上的一篇文章讲到C++因为没有反射机制,所以如何注册测试用例就成了一件需要各显神通的事情.从我的经验来看,无论是Google的GTest还是微软的LTM ...
- ruby 元编程
一 对象模型 kernel Module Kernel.private_instance_methods.grep(/^pr/) private method 1 如果一个方法接收者不是你自己,一 ...
- 3-18/19 (自我练习)30多个《Ruby元编程》的spell(pattern)小例子。
Spell,也称pattern,idiom # Around Alias:从一个重新定义的方法中调用原始的,被重命名的版本. # old_reverse是未改变的原始方法,reverse/new_re ...
- Ruby元编程:执行某个目录下的全部测试用例
目前手里有个测试项目各个feature的测试用例都放在对应的子目录下,虽然有自动化测试框架的帮助执行起来很方便,但是偶尔也有需要在本地执行某个feature的全部测试用例集合.因为本人对shell脚本 ...
- 201706 Ruby 基础 & 元编程
yield yield self Proc yield带参数 rails中:yield 和 content_for methods.proc.lambda.block 闭包(用proc延长变量的生命周 ...
- Groovy元编程简明教程
同函数式编程类似,元编程,看上去像一门独派武学. 在 <Ruby元编程>一书中,定义:元编程是运行时操作语言构件的编程能力.其中,语言构件指模块.类.方法.变量等.常用的主要是动态创建和访 ...
随机推荐
- jemter-plugins-maven dependency -WIiki用法配置介绍
1.先介绍下jmeter 的maven中央仓库地址,有兴趣自己看下 https://mvnrepository.com/artifact/org.apache.jmeter 2.Wiki github ...
- Day11 - F - A Dangerous Maze LightOJ - 1027
求期望注意期望的定义,这题我们可以分正负数情况,设所求期望为E 正数: 1/n*x_i 负数:1/n*(E+x_j) 此时概率为1/n,根据期望定义,他回到起点后出去的期望为E,花费回起点的时间为x_ ...
- js学习:函数
概述 函数的声明 JavaScript 有三种声明函数的方法 function 命令 function命令声明的代码区块,就是一个函数.function命令后面是函数名,函数名后面是一对圆括号,里面是 ...
- Keras下载的数据集以及预训练模型保存在哪里
Keras下载的数据集在以下目录中: root\\.keras\datasets Keras下载的预训练模型在以下目录中: root\\.keras\models 在win10系统来说,用户主目录是: ...
- 登陆页面Sql注入(绕过)
如图,看到这道题的时候发觉之前做过一个类似的手工注入: 不过这次手注会失败,后台过滤了sql语句里的一些东西,但我们并不知道过滤了什么 到这里我就基本上没辙了,不过查询了资料以后发现sqlmap可以对 ...
- java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.2457258178644046891.8080/work/Tomcat/localhost/innovate-admin/C:/up/154884318438733213952/sys-error.log (没有那个文件或目录)
环境: Ubuntu18 vue+elementUI 实现文件的上传 报错信息: MultipartFile.transferTo(dest) 报 FileNotFoundException java ...
- 学习笔记(13)- decaNLP训练WikiSQL
将自然语言转为sql语句,达到对话查询报表的效果. 参考资料 参考1 https://mp.weixin.qq.com/s/i7WAFjQHK1NGVACR8x3v0A 语义解析.SQL查询生成与语义 ...
- 【PAT甲级】1014 Waiting in Line (30 分)(队列维护)
题面: 输入四个正整数N,M,K,Q(N<=20,M<=10,K,Q<=1000),N为银行窗口数量,M为黄线内最大人数,K为需要服务的人数,Q为查询次数.输入K个正整数,分别代表每 ...
- task20160125
http://task.zbj.com/2034844/n15o1.html 百度开放平台--首页>帮助文档首页>Frontia>Android开发指南>个人数据存储 http ...
- Day11 - L - 邂逅明下 HDU - 2897
当日遇到月,于是有了明.当我遇到了你,便成了侣.那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废话)小t和所有世俗的人们一样,期待那百年难遇的日食.驻足 ...