代码:
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
我意识到一个在类的上下文中进行求值,而另一个在实例的上下文中进行求值,但是......在这种情况下,为什么它们会这样返回? (我原本预计会有一个例外。)
答案 0 :(得分:4)
在你的例子中没有区别。
> Foo1.instance_eval { puts self }
Foo1
> Foo1.class_eval { puts self }
Foo1
类的实例是类本身。 instance_eval
在这里没有任何“额外”的东西。但是如果你在一个类的实例上使用它,那么你会得到不同的行为。即Foo1.new.instance_eval ...
。
请看这里有一个很好的解释:
How to understand the difference between class_eval() and instance_eval()?