在定义单例方法之前是否存在特征类
在对象或类上。即它们总是存在还是存在
何时定义单例方法或类方法?

最佳答案

每个对象总是有一个单例类。时期。没有如果,没有但是,没有异常(exception)。

根据编译器或解释器的聪明程度,它可能会或可能不会执行某些性能优化。但是和所有的性能优化一样,这些优化是不允许改变程序的结果的,所以即使这些性能优化确实导致特定单例类实际上不存在的某些状态,程序仍然必须表现得好像它确实存在一样,所以你无论如何也说不出来。毕竟,这几乎就是“性能优化”的定义。

一些 Ruby 实现可能会做一些优化,其他人可能会做其他优化,有些甚至可能根本不做任何优化。你不能从你的程序的结果中看出,你不应该关心,你一定不关心。

例如,YARV 执行以下优化:

  • 由于几乎没有对象有单例方法,为每个对象创建单例类会浪费内存,因此单例类是惰性创建的:当您创建单例方法( def foo.barObject#define_singleton_method )时,当您打开单例类时( class << foo ),以及当您请求对象的单例类 ( Object#singleton_class ) 时。
  • 由于几乎每个类都有某种类方法,懒惰创建单例类的开销没有意义,所以对于类,总是急切地创建单例类。

  • 但这是 YARV 的私有(private)内部实现细节。 JRuby 的做法可能有所不同。 IronRuby 的做法可能有所不同。 MacRuby 的做法可能有所不同。 MRuby 的做法可能有所不同。黄 Jade 可能会有所不同。 Rubinius 可能会这样做。 MagLev 可能会有所不同。甚至 YARV 的下一个补丁级别也可能会有所不同。

    如果您查看单例类,它就在那里。如果你不看它,它是否在那里都没有关系。因此,从语义上讲,它始终存在。

    10-08 04:40