【问题标题】:Difference between class_eval and instance_eval in a module模块中class_eval和instance_eval的区别
【发布时间】:2011-07-08 22:21:56
【问题描述】:

代码:

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

我意识到一个在类的上下文中进行评估,而另一个在实例的上下文中进行评估,但是......在这种情况下,为什么它们会这样返回? (我本以为其中一个会出现异常。)

【问题讨论】:

标签: ruby


【解决方案1】:

在您的示例中没有区别。

> Foo1.instance_eval { puts self } 
Foo1

> Foo1.class_eval { puts self }
Foo1

类的实例就是类本身。 instance_eval 在这里没有给你任何“额外”的东西。但是如果你在一个类的实例上使用它,那么你会得到不同的行为。 IE。 Foo1.new.instance_eval ....

请看这里以获得更好的解释:
How to understand the difference between class_eval() and instance_eval()?

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 2010-10-28
    • 2012-05-05
    • 2017-04-22
    • 2011-05-23
    • 1970-01-01
    • 2017-05-06
    • 2011-03-26
    • 2013-08-05
    相关资源
    最近更新 更多