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
怎么来的?任何人都可以阐明这一点吗?