ruby什么时候才能成为特征类

时间:2013-08-18 02:01:55

标签: ruby eigenclass

在定义单例方法之前,是否存在Eigenclasses 在对象或类上。即它们是否总是存在或存在 当一个单例方法或类方法定义?

2 个答案:

答案 0 :(得分:5)

每个对象始终都有一个单例类。期。没有ifs,没有buts,没有例外。

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

某些Ruby实现可能会进行一些优化,其他可能会进行其他优化,有些甚至可能根本不进行任何的优化。你不能从你的计划结果中得知,你不应该在乎,你一定不能关心。

例如,YARV执行以下优化:

  • 由于几乎没有对象具有单例方法,因此为每个对象创建单例类将浪费内存,因此懒惰地创建单例类:当您创建单例方法时({ {1}}或def foo.bar),当你打开单例类(Object#define_singleton_method)时,以及当你要求对象的单例类(class << foo)时。

  • 由于几乎每个类都有某种类方法,因此懒惰地创建单例类的开销没有意义,所以对于类来说,总是急切地创建单例类。

但这是YARV的私人内部实施细节。 JRuby可能采用不同的方式。 IronRuby可能采用不同的方式。 MacRuby可能会采用不同的方式。 MRuby可能会采用不同的方式。黄玉可能会采用不同的方式。鲁宾尼斯可能会采用不同的方式。 MagLev可能采用不同的方式。即使是YARV的下一个补丁级也可能采用不同的方式。

如果你看一下单身人士课,那就在那里。如果你看它,它是否在那里并不重要。所以,在语义上,它总是在那里。

答案 1 :(得分:0)

对于像class这样的对象,当创建一个新类时,它的特征类也会被创建,并在创建它们时创建它们的对象。

示例: - 创建一个类

class User; end

User = Class.new

它的本征类也是同时创建的,

并且为User class的每个对象创建了一个单独的特征类