3-8《Ruby元编程》第二章对象模型
第二章 对象模型
类定义揭秘inside class definitions: class关键字更像一个作用域操作符,核心作用是可以在里面随时定义方法。
[].methods.grep(/^re/):调用 出Array的所有以re开头的method.
Monkeypatch:涉及全局修改,定义某个方法前应该仔细检查该类是否已有同名的方法。
实例对象存放在对象中,方法存放在类中。
类的真相:类本身也是对象。Ruby允许在运行时修改类的信息。
Class.instance_methods
Array.superclass =>Object
模块
类也是模块,是带有三个方法new,allocate,superclass的增强模块。
代码要include,使用module.代码需要被实例化或被继承用class.
类就是一个对象外加一组实例方法和一个对其超类的引用。 类和其他对象一样必须通过引用来访问。
常量,任何以大写字母开头的引用(包括类名和模块名)。常量和变量的区别是作用域不一样。常量的作用域类似于文件系统中的文件,在不同目录下,不同的文件可以有相同的名字。
常量的路径:用::双冒号进行分隔。
Module.nesting方法:返回当前代码的路径
module M
class C
module M2
Module.nesting #=>[M::C::M2, M::C, M]
end
end
end
Ruby常量,可以用module来存放常量,这样不同的类库的类名就不会产生冲突。
如Rake是流行的Ruby构建版本。gems/rake-1.0/lib/rake/task.rb
module Rake
class Task
#...
这里Task类的全名就变成 Rake::Task . 不会再和其他类库的类名冲突了。
命名空间Namespace : 只充当常量容器的模块。
2.4What Happends when you call a method?
- 查找方法。Method lookup(原则:object找到所在类,再顺着祖先链查找方法). receiver和ancestors-chain
- 执行这个方法。self
include:把模块插到祖先链中包含它的该类的后面。先查找该类的method。
prepend: 把模块插到祖先链中包含它的该类的前面。先在prepend 模块中查找method。
kernel是核心模块被Object包含了。通过给Kernel模块加一个方法,就对所有对象可用了。这个方法称作内核方法.如Awesome_print包的方法ap就用了内核方法。
Method Execution
Ruby的每一行代码都会在一个对象中被执行--这个对象就是当前对象,self
没有明确指定receiver的method都在self上调用。
Private私有方法
1.如果调用方法的接收者不是自己,就必须指明接受者
2.私有方法只能通过隐性的接受者self调用。
3 所以只能在自身中调用私有方法,或者继承来的私有方法。--私有规则
顶层上下文top level context
如果没有调用任何方法,self是Ruby提供的叫main的对象(也称为top level context)main.class #=> Object
在类和模块定义中,self是这个类或模块本身。
Refinement 细化:
技巧用途:使修改kernal里的类的方法只在局部代码中有效,不会影响其他代码,防止猴子补丁。
Module#refine,Refine mod in the receiver.Returns a module, where refined methods are defined.
Module#using:Import class refinements from module into the current class or module definition.
- 首先,定义一个模块
- 然后,在这个模块的定义中调用refine方法。
- 在另一个模块内部,使用Module#using方法,细化的作用范围就限定在该模块内部了。或者在文件main中调用using,在文件结束前生效。
3-8《Ruby元编程》第二章对象模型的更多相关文章
- 3-11 《Ruby元编程》第4章block块 3-12
第4章代码块blocks 基础知识 作用域:用代码块携带variables through scopes 通过传递block给instance_eval方法来控制作用域. 把block转换为Proc, ...
- [转]Windows Shell 编程 第二章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987893】
第二章Shell的结构 “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ...
- Ruby元编程:单元测试框架如何找到测试用例
前几天看了Google Testing Blog上的一篇文章讲到C++因为没有反射机制,所以如何注册测试用例就成了一件需要各显神通的事情.从我的经验来看,无论是Google的GTest还是微软的LTM ...
- 201707《Ruby元编程》
元编程不过是编程--经典必读 作用域(绑定) 打破作用域门的方式 对象模型图 七条规则 法术手册 作用域(绑定) 改变作用域的关键字, 分别是module,class和def.我们称为作用域的门(sc ...
- Ruby元编程:动态添加类属性及其实际应用
上个星期测试道的Monkey老师和我聊到测试用例参数过多的问题,其实这样的问题在我这里也同样经历过.比如我的测试用例必须面对不同的测试环境,每个环境有无数的参数,开发的最初阶段,因为参数少,所以就放在 ...
- java面向对象编程——第二章 java基础语法
第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...
- 使用MYSQL数据库实现编程----第二章第三章课堂知识小总结
第二章1:创建数据库create database myschool 2.数据类型 1.整型 int 2.小数 double 精确度要求高的 ----Decimal(18,4) 2222222 ...
- 读高性能JavaScript编程 第二章 让我知道了代码为什么要这样写
代码为什么要这样写? function initUI(){ var doc = document, bd = doc.body, links = doc.getElementsByTagName_r( ...
- Java面向对象编程 第二章 第一个Java应用
2.1创建Java源文件 Java应用由一个或多个扩展名为".java"的文件构成,这些文件被称为Java源文件,从编译的角度,则被称为编译单元. 本章包含两个Java源文件:Do ...
随机推荐
- iOS 建立项目过滤机制 —— 给工程添加忽略文件.gitignore
目前iOS 项目 主要忽略 临时文件.配置文件.或者生成文件等,在不同开发端这些文件会大有不同,如果 git add .把这些文件都push到远程, 就会造成不同开发端频繁改动和提交的问题. ...
- 生产者消费者模型——wait/notify/notifyAll使用
告警系统架构如下 1. 数据处理系统处理完原始数据并入库后,发送消息到kafka系统: 2. 告警生产者从kafka系统查询消息存入告警消息队列: 3. 告警消费者从告警消息队列查询消息进行处理. 这 ...
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数. Google2009华南地 ...
- Android查缺补漏(View篇)--布局文件中的“@+id”和“@id”有什么区别?
Android布局文件中的"@+id"和"@id"有什么区别? +id表示为控件指定一个id(新增一个id),如: <cn.codingblock.vie ...
- 【运维技术】Maven + Gogs + Nexus 实现版本管理 + 代码模块开发管理
Gogs:能够实现fork + 代码提交 + 代码框架 Nexus:进行jar包的版本管理,私服下载jar包共享jar包 Maven:在客户端进行模块管理和批量操作 1. 本地maven仓库配置配置s ...
- python网络编程之一
套接字的详细介绍会在另一篇博文指出,此片博文主要是python套接字的简单客户端编写. 两种套接字介绍: 面向连接的套接字:面向连接的套接字提供序列化,可靠的和不重复的数据交付.面向连接是可靠的传输, ...
- web.xml配置详解之listener
web.xml配置详解之listener 定义 <listener> <listener-class>nc.xyzq.listener.WebServicePublishLis ...
- 某模拟题(USACO部分题+noip2005部分题)
题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1..1000的范围内.拖拉 ...
- 联合权值dp
联合权值 洛谷中可找到 题目传送门https://www.luogu.org/problemnew/show/P1351 这题我就得了70分(TLE) GG了 就是遍历它孩子的孩子(爷爷和孙子),然 ...
- 【修改编码】修改tomcat默认的编码方式
默认情况下,tomcat使用的的编码方式:iso8859-1 修改tomcat下的conf/server.xml文件 找到如下代码: <Connector port="8080& ...