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>
类求值方法是为模块(以及类)定义的,并在模块(类)的上下文中求值实例评估方法在BasicObject的上下文中求值。在这些情况下,两个(实际上是三个)似乎是一回事。
但是,我知道一个事实,如果方法是在eval块中创建的,那么类eval创建实例方法,实例eval创建类方法。对于这一观察,已经有一个很好的帖子:
关于ruby - 深入了解Ruby class_eval和instance_eval,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41022993/