红宝石何时才能生成本征类
在对象或类上定义单例方法之前,是否存在特征类。 即当定义了单例方法或类方法时,它们是否总是存在或存在?
每个对象总是有一个单例类。 期。 没有ifs,没有buts,没有例外。
取决于编译器或解释器的聪明程度,它可能会或可能不会执行一些性能优化。 但是就像所有的性能优化一样,这些都不允许改变程序的结果,所以即使这些性能优化确实导致某些特定的单例类实际上不存在的状态,程序仍然必须表现得好像它确实存在一样,所以你无论如何都无法分辨。 毕竟,这几乎是“性能优化”的定义。
一些Ruby实现可能会做一些优化,其他的可能会做其他优化,有些甚至可能根本就不做任何优化。 你不能从你的程序结果中知道,你不应该在意,你一定不在乎。
例如,YARV执行以下优化:
由于几乎没有对象具有单例方法,因此为每个对象创建一个单例类会浪费内存,因此单例类是懒惰创建的:当您创建单例方法( def foo.bar
或Object#define_singleton_method
)时,当您打开单例类( class << foo
),以及当你要求一个对象的单例类( Object#singleton_class
)时。
由于几乎每个类都有某种类方法,因此懒惰地创建单例类的开销并不合理,因此对于类,单例类始终是急切地创建的。
但这是YARV私人内部实施细节。 JRuby可能会有所不同。 IronRuby可能会有所不同。 MacRuby可能会做不同的事情。 MRuby可能会有所不同。 黄玉可能会有所不同。 鲁比尼乌斯可能会做不同的事情。 MagLev可能会有所不同。 即使是YARV的下一个补丁级别也可能会有所不同。
如果你看看单身人士课程就在那里。 如果你不看它,它是否在那里并不重要。 所以,在语义上,它总是在那里。
对于象类这样的对象来说,当创建一个新类时,它的特征类也会被创建,并且当它们被创建时它们的对象也会被创建。
例如: - 创建一个班级
class User; end
要么
User = Class.new
它的本征类也是同时创建的,
并为User类的每个对象创建一个单独的特征类
链接地址: http://www.djcxy.com/p/95437.html