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

为什么?有人能解释一下吗?

最佳答案

让我们看看自我在这里是什么:

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/

10-11 02:35