【问题标题】:ruby when to eigenclasses come into existence红宝石什么时候出现特征类
【发布时间】:2013-08-20 03:21:58
【问题描述】:

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

【问题讨论】:

    标签: ruby eigenclass


    【解决方案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
      

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

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

      【讨论】:

        猜你喜欢
        • 2017-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        相关资源
        最近更新 更多