繁体   English   中英

深入了解Ruby class_eval和instance_eval

[英]Deep into Ruby class_eval and instance_eval

在诸如定义方法之类的情况下, 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>

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

但是,我知道一个事实,即如果在eval块是class_eval创建实例方法和instance_eval的创建类的方法里面创建的方法。 该观察已经有一篇很好的文章:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM