gpt4 book ai didi

ruby - 模块中 class_eval 和 instance_eval 的区别

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:56 24 4
gpt4 key购买 nike

代码:

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

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

最佳答案

在您的示例中没有区别。

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

关于ruby - 模块中 class_eval 和 instance_eval 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com