ruby元编程——类定义




(1)类是一个增强的模块,所以所有类定义中的特性都同样适用于模块定义。

(2)Ruby程序中总是存在一个当前对象:self,类似地,也总有一个当前类或模块存在,当定义一个方法时,该方法将成为当前类的一个实例方法。

(3)当通过class关键字打开一个类时,这个类就成为当前类。

(4)Module#class_eval()方法(module_eval())方法可以在不知道类名的情况下打开一个类,例:

?
1
2
3
4
5
6
7
def  add_method_to(a_class)
     a_class.class_eval  do
         def  m
             'Hello'
         end
     end
end



(5)类变量是以@@开头的变量,类变量与类实例变量不同,它们可以被子类或者类的实例所使用

(6)单件方法,可以给当个对象添加方法,例:

?
1
2
3
4
5
6
7
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:

?
1
2
3
4
5
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的实例方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值