在定义单例方法之前是否存在特征类在对象或类上。他们总是存在还是存在什么时候定义了singleton方法或类方法?
每个对象总是有一个singleton类。时期没有如果,没有但是,没有例外。
根据编译器或解释器的智能程度,它可能会执行某些性能优化,也可能不会执行。但是,与所有性能优化一样,这些优化不允许更改程序的结果,因此,即使的性能优化导致特定的singleton类实际上不存在的某些状态,程序仍然必须表现得像确实存在,所以无论如何都无法判断。毕竟,这几乎就是"性能优化"的定义。
有些Ruby实现可能会进行一些优化,有些可能会进行其他优化,有些甚至可能根本不进行任何优化。你不能从你的程序结果中判断出来,你不应该在乎,你不能在乎。
例如,YARV执行以下优化:
-
由于几乎没有对象具有singleton方法,为每个对象创建singleton类将是浪费内存,因此singleton类的创建是惰性的:当您创建singleton方法(
def foo.bar
或Object#define_singleton_method
)时,当您打开singleton类(class << foo
)时,以及当您请求对象的singleton类时(Object#singleton_class
)。 -
由于几乎每个类都有某种类方法,延迟创建singleton类的开销是没有意义的,所以对于类来说,singleton类总是被急切地创建。
但这是YARV的私人内部实现细节。JRuby可能会采取不同的做法。IronRuby可能会采取不同的做法。MacRuby可能会采取不同的做法。MRuby可能会采取不同的做法。黄玉可能会有不同的做法。鲁宾尼乌斯可能会采取不同的做法。MagLev可能会采取不同的做法。即使是YARV的下一个补丁级别也可能会有所不同。
如果你看看singleton类,它就在那里。如果你不看它,它是否在那里并不重要。所以,从语义上讲,它总是存在的。
对于类这样的对象,当创建一个新类时,它的本征类也会被创建,并且当创建它们时,它们的对象的本征类别也会被生成。
示例:-创建类
class User; end
或
User = Class.new
它的本征类也同时产生,
并且为用户类的每个对象创建一个单独的本征类