模块中class_eval和instance_eval之间的区别
码:
module Mod1 def self.included(base) base.class_eval do class << self attr_accessor :test end @test = 'test1' end end end module Mod2 def self.included(base) base.instance_eval do class << self attr_accessor :test end @test = 'test2' end end end class Foo1 include Mod1 end class Foo2 include Mod2 end puts Foo1.test puts Foo2.test
输出是:
test1 test2
我意识到一个在类的上下文中进行求值,而另一个在实例的上下文中进行求值,但是……在这种情况下,为什么它们会这样返回? (我原本预计会有一个例外。)
在你的例子中没有区别。
> Foo1.instance_eval { puts self } Foo1 > Foo1.class_eval { puts self } Foo1
类的实例是类本身。 instance_eval
在这里没有给你任何额外的东西。 但是如果你在一个类的实例上使用它,那么你会得到不同的行为。 即Foo1.new.instance_eval ...
在这里看到一个很好的解释:
如何理解class_eval()和instance_eval()之间的区别?