ruby本征类何时产生



在定义单例方法之前是否存在特征类在对象或类上。他们总是存在还是存在什么时候定义了singleton方法或类方法?

每个对象总是有一个singleton类。时期没有如果,没有但是,没有例外。

根据编译器或解释器的智能程度,它可能会执行某些性能优化,也可能不会执行。但是,与所有性能优化一样,这些优化不允许更改程序的结果,因此,即使的性能优化导致特定的singleton类实际上不存在的某些状态,程序仍然必须表现得像确实存在,所以无论如何都无法判断。毕竟,这几乎就是"性能优化"的定义

有些Ruby实现可能会进行一些优化,有些可能会进行其他优化,有些甚至可能根本不进行任何优化。你不能从你的程序结果中判断出来,你不应该在乎,你不能在乎。

例如,YARV执行以下优化:

  • 由于几乎没有对象具有singleton方法,为每个对象创建singleton类将是浪费内存,因此singleton类的创建是惰性的:当您创建singleton方法(def foo.barObject#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

它的本征类也同时产生,

并且为用户类的每个对象创建一个单独的本征类

相关内容

  • 没有找到相关文章

最新更新