红宝石啥时候出现特征类
Posted
技术标签:
【中文标题】红宝石啥时候出现特征类【英文标题】:ruby when to eigenclasses come into existence红宝石什么时候出现特征类 【发布时间】:2013-08-20 03:21:58 【问题描述】:在定义单例方法之前是否存在特征类 在对象或类上。即它们是一直存在还是存在 什么时候定义了单例方法或类方法?
【问题讨论】:
【参考方案1】:每个对象总是有一个单例类。时期。没有如果,没有但是,没有例外。
根据编译器或解释器的聪明程度,它可能会或可能不会执行一些性能优化。但与所有性能优化一样,不允许更改程序的结果,因此即使这些性能优化确实会导致特定单例类实际上的某些状态> 存在,程序仍然必须 表现得好像它确实 存在,所以无论如何你都无法判断。毕竟,这几乎就是“性能优化”的定义。
一些 Ruby 实现可能会进行一些优化,其他可能会进行其他优化,有些甚至可能根本不进行任何优化。你无法从程序的结果中看出,你不应该关心,你不必关心。
例如,YARV 执行以下优化:
由于几乎没有对象有单例方法,为每个对象创建一个单例类会浪费内存,因此单例类是懒惰地创建的:当你创建一个单例方法时(@ 987654321@ 或 Object#define_singleton_method
),当你打开单例类 (class << foo
),以及当你请求一个对象的单例类时 (Object#singleton_class
)。
由于几乎每个类都有某种类方法,所以懒惰地创建单例类的开销没有意义,因此对于类,单例类总是急切地创建。
但这是 YARV 的私有内部实现细节。 JRuby 可能会有所不同。 IronRuby 可能会有所不同。 MacRuby 可能会有所不同。 MRuby 可能会有所不同。黄玉可能会有所不同。鲁比尼乌斯可能会做不同的事情。 MagLev 可能会采取不同的做法。甚至 YARV 的下一个补丁级别也可能会有所不同。
如果您查看单例类,它就在那里。如果你不看它,它是否在那里并不重要。所以,从语义上讲,它总是存在的。
【讨论】:
【参考方案2】:对于像类这样的对象,当一个新类被创建时,它的特征类也被创建,以及它们的对象在被创建时。
示例:- 创建一个类
class User; end
或
User = Class.new
它的特征类也是同时创建的,
并且为用户类的每个对象创建一个单独的特征类
【讨论】:
以上是关于红宝石啥时候出现特征类的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 的数据啥时候加载?啥时间 tableview 调用它的委托方法。 viewWill 之后会出现吗?