模块中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()之间的区别?