按照yugui 大姐的说法,class_eval和instance_eval有如下的区别:
class&instance_eval self default definee
class_eval the receiver the receiver
instance_eval the receiver eigenclass of the receiver
上面就是class_eval与instance_eval的区别了,一般情况下这个没有问题(个人感觉)。但还是会有令迷惑的地方。
下面的例子说明了,在下面情况下,class_eval和instance_eval的作用没有区别。
class A end class Object def eigenclass class << self;self;end end end A.class_eval do p self def hehe "hehe" end define_method(:xixi) do "xixi" end end A.instance_eval do p self def haha;"haha";p self ;end end A.instance_eval do p self define_method(:hihi) do "hihi" p self.to_s end end A.haha A.new.hihi p A.instance_methods p "*"*120 p A.eigenclass.instance_methods
定义的hihi和xixi都是A是实例方法。
jayfield
说到:
jayfield的说法应该是有问题的,但不这样理解,上面的例子怎么又说得通呢?
PS:可能是我表述不清还是怎么的,基本上没有人对此关注。实际上我想说的就是:
A.instance_eval do p self def haha;"haha";p self ;end end A.instance_eval do p self define_method(:hihi) do "hihi" p self.to_s end end
同样是用instance_eval,为什么有这么大的不同。
A.new.hihi A.haha
事实上,
A.instance_eval do
p self
define_method(:hihi) do
"hihi"
p self.to_s
end
end
与 class A
define_method(:hihi) do
"hihi"
end
end
的效果是一样的,define_method是个私有方法,能调用(隐式)它的只能是类对象而非一般的对象。
在一个网站 上看到了这个:
现在可以比较直观的理解这二者的不同了