他们主要特点
- class 《 object : 给当前对象object(可能是类本身,或者实例对象)添加 singleton_method
- object.instance_eval : 给当前对象object(可能是类本身,或者实例对象)添加 singleton_method 与class 《 object相似
- Object.class_eval : 相当于(但实事不是)打开当前Object(只能是类) 给他添加 实例方法,具体原理看下面分析
他们具体的区别
class 《 object
object 可能是类本身,或者实例对象
- object 是一个实例对象,则添加的方法只对该实例对象生效
- object 是一个类,则可以理解为给该类添加了一个类方法
object.instance_eval
首先从名字可以得到的信息是,instance_eval的调用者receiver必须是一个实例instance,而在instance_eval block的内部,self即为receiver实例本身
同样,因为类class本身也是Class类的一个实例,instance_eval也可以用在类上,这个时候就可以在其中定义该类的singleton_method,即为该类的类方法
所以object 可能是类本身,或者实例对象
- object 是一个实例对象,则添加的方法只对该实例对象生效
所以
假如我像下面这样定义:
本质上相当于这样的代码:
###class_eval
class_module是从Module中得到的,所以class_module的接受者必须是个类 换句话说class_eval的调用者receiver必须是一个类,而在class_eval block的内部,self即为receiver类本身。
我们知道在混合编程(mix)中,include 某个Module时,该Module的所有实例方法只能由子类的实例所调用(相当于多了继承于Module),故class_eval定义之后,只能是Array的所有的实例调用,Array自己调用会出错(肯定的,假如Array自己调用不出错的话,这个方法就是静态方法了)
所以 Object.class_eval 实质就是给当前这个类添加了 实例方法
总结
- class 《 object : 其实就是操作的object eigenclass
- object.instance_eval : 其实就是操作的object eigenclass
- Object.class_eval : 其实修改的是Object的类体