模块中class_eval和instance_eval之间的区别

时间:2011-07-08 22:21:57

标签: ruby

代码:

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

我意识到一个在类的上下文中进行求值,而另一个在实例的上下文中进行求值,但是......在这种情况下,为什么它们会这样返回? (我原本预计会有一个例外。)

1 个答案:

答案 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()?