ruby元编程——类定义
2015-04-08 00:00
190 查看
摘要: 星期四:类定义笔记
(1)类是一个增强的模块,所以所有类定义中的特性都同样适用于模块定义。
(2)Ruby程序中总是存在一个当前对象:self,类似地,也总有一个当前类或模块存在,当定义一个方法时,该方法将成为当前类的一个实例方法。
(3)当通过class关键字打开一个类时,这个类就成为当前类。
(4)Module#class_eval()方法(module_eval())方法可以在不知道类名的情况下打开一个类,例:
(5)类变量是以@@开头的变量,类变量与类实例变量不同,它们可以被子类或者类的实例所使用
(6)单件方法,可以给当个对象添加方法,例:
(7)类方法的实质就是:它们是一个类的单件方法
(8)Module#attr_reader()、attr_writer()、attr_accessor()可以用于生成读、写、两者都生成
(9)eigenclass,获取一个eigenclass:
(10)eigenclass只有一个实例并且不能改被继承
(11)到调用一个对象调用单件方法时,如果对象有eigenclass,先去eigenclass找,再向上找父类
(12)alias :new_name :old_name 可以用来给方法取别名。alias是个关键字,和他类似的还有一个Module#alias_method方法
(13)环绕别名:
(1)给方法定义一个别名
(2)重定义这个方法
(3)在新的方法中调用老的方法
(14)加上eigenclass后的类关系图:
由于图已经比较乱了,Class类的class箭头没有给出,Class.class #=> Class
从上图,可以看出很多的规律:
一个类(class指向Class)和它的eigenclass以及父类和父类的eigenclass总是存在一个四角关系
一个对象与他的类和对象的eigenclass总是存在一个三角关系
ruby真正的方法查询,其实是先找接收者的eigenclass,在向上找父类
比较特殊的一点是BasicObject的eigenclass的父类是Class,所以所有的类按上面的方法查找方式,都会找到Class类,才会都有new方法和superclass(new方法和superclass方法是Class的实例方法)
(1)类是一个增强的模块,所以所有类定义中的特性都同样适用于模块定义。
(2)Ruby程序中总是存在一个当前对象:self,类似地,也总有一个当前类或模块存在,当定义一个方法时,该方法将成为当前类的一个实例方法。
(3)当通过class关键字打开一个类时,这个类就成为当前类。
(4)Module#class_eval()方法(module_eval())方法可以在不知道类名的情况下打开一个类,例:
def add_method_to(a_class) a_class.class_eval do def m 'Hello' end end end
(5)类变量是以@@开头的变量,类变量与类实例变量不同,它们可以被子类或者类的实例所使用
(6)单件方法,可以给当个对象添加方法,例:
str = "Just a regular string" def str.title? self.upcase == self end str.title? #=>false str.methods.grep(/title?/) #=>["title?"] str.singleton_methods #=>["title?"]
(7)类方法的实质就是:它们是一个类的单件方法
(8)Module#attr_reader()、attr_writer()、attr_accessor()可以用于生成读、写、两者都生成
(9)eigenclass,获取一个eigenclass:
obj = Obejct.new eigenclass = class << obj self end eigenclass.class #Class
(10)eigenclass只有一个实例并且不能改被继承
(11)到调用一个对象调用单件方法时,如果对象有eigenclass,先去eigenclass找,再向上找父类
(12)alias :new_name :old_name 可以用来给方法取别名。alias是个关键字,和他类似的还有一个Module#alias_method方法
(13)环绕别名:
(1)给方法定义一个别名
(2)重定义这个方法
(3)在新的方法中调用老的方法
(14)加上eigenclass后的类关系图:
由于图已经比较乱了,Class类的class箭头没有给出,Class.class #=> Class
从上图,可以看出很多的规律:
一个类(class指向Class)和它的eigenclass以及父类和父类的eigenclass总是存在一个四角关系
一个对象与他的类和对象的eigenclass总是存在一个三角关系
ruby真正的方法查询,其实是先找接收者的eigenclass,在向上找父类
比较特殊的一点是BasicObject的eigenclass的父类是Class,所以所有的类按上面的方法查找方式,都会找到Class类,才会都有new方法和superclass(new方法和superclass方法是Class的实例方法)
相关文章推荐
- typedef的形式定义,猜ing,求证
- spin_lock的定义
- MakeFile预定义变量
- Android预定义样式
- PL/SQL中,declare定义变量和variable定义变量的区别?
- 关于宏函数的定义
- Python教程学习简记2--Python 函数调用 定义函数 函数的参数 递归函数
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 1(定义子程序)
- STM32类型定义
- vbscript基础篇 - vbs变量定义与使用方法
- Log4j使用技巧――让子类使用父类中定义的Logger
- 定义并初始化时调用拷贝构造函数
- 第3天:定义语言编码
- 黑马程序员--类与类成员的定义
- js中定义一个变量 var params=null;判断params 为/不为 空的方法
- 变量定义和声明的区别
- 队列的定义与实现(C语言实现)
- 数据类型——变量常量和声明与定义
- Spring(16)——使用注解进行bean定义(二)
- PHP实现链表的定义与反转功能示例