![](/img/trans.png)
[英]Accessing Ruby Class Variables with class_eval and instance_eval
[英]Deep into Ruby class_eval and instance_eval
在诸如定义方法之类的情况下, class_eval
和instance_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
怎么会? 有人可以阐明这一点吗?
让我们来看看这里的自我:
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块是class_eval创建实例方法和instance_eval的创建类的方法里面创建的方法。 该观察已经有一篇很好的文章:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.