gpt4 book ai didi

ruby - 深入 Ruby class_eval 和 instance_eval

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:57 30 4
gpt4 key购买 nike

class_evalinstance_eval 在定义方法等情况下是完全可以预测的。我也理解类的实例和类的单例(又名特征类)之间的区别。

但是

我无法弄清楚以下唯一的事情:比方说,出于某些策略目的,我们希望将现有类设为单例。

class A; end
class B; end

A.class_eval do
private :new
end

B.instance_eval do
private :new
end

在这两种情况下都得到了

NameError: undefined method 'new' for class
Did you mean? new

是的,我的意思就是这个方法。

此外,这两个变体给出了相同的结果,就像在这两种情况下 self 都指向类对象

A.class_eval do
class << self
private :new
end
end

A.new
=> NoMethodError: private method 'new' called for A:Class

B.instance_eval do
class << self
private :new
end
end

B.new
=> NoMethodError: private method 'new' called for B:Class

怎么会?任何人都可以阐明这一点吗?

最佳答案

让我们看看这里的 self 是什么:

class A
puts self.inspect

class << self
puts self.inspect
end
end

A.class_eval {
puts self.inspect

class << self
puts self.inspect
end
}

A.instance_eval{
puts self.inspect

class << self
puts self.inspect
end
}

我们得到以下输出:

A
#<Class:A>
A
#<Class:A>
A
#<Class:A>

class_eval 方法是为模块(以及类)定义的,并在模块(类)的上下文中进行评估。 instance_eval 方法在 BasicObject 的上下文中进行评估。在这些情况下,这两个(实际上是三个)似乎是一回事。

但是,我知道一个事实,如果方法是在 eval block 内创建,则 class_eval 会创建实例方法,而 instance_eval 会创建类方法。已经有一篇关于该观察的优秀帖子:

关于ruby - 深入 Ruby class_eval 和 instance_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41022993/

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