【问题标题】:Singleton class and meta class单例类和元类
【发布时间】:2014-08-05 07:30:21
【问题描述】:

我知道单例类是什么。单例类用于保存为对象定义的单例方法。元类和单例类是一样的吗?谁能解释一下什么是元类?关于元类的一些信息给出了单例类的例子。两者是同一事物还是相互关联?

【问题讨论】:

    标签: ruby singleton metaclass


    【解决方案1】:

    在书 - The Ruby Programming Language 第 257 页中,Matz 解释了您的问题如下:

    对象的单例方法是与该对象关联的匿名eigenclass 的实例方法。 “Eigen”是一个德语单词,意思是(大致)“自我”、“自己的”、“特定的”或“特征的”。 eigenclass 也称为 单例类或(不太常见的)元类“eigenclass”一词在 Ruby 社区内并未被统一接受,但我们将在本书中使用它。

    【讨论】:

    • 只有引文中的最后两句与问题相关。
    【解决方案2】:

    我认为元类是一些人将单例类称为非官方的方式。除了单例类,eigenclass 是它的另一个官方名称。

    【讨论】:

      【解决方案3】:

      长期以来,现在被称为“单例类”的东西没有正式名称。人们称它为各种不同的东西,包括但不限于:

      • 单例类
      • 特征类
      • 元类
      • 虚拟类
      • 鬼类
      • 影子类

      这些都是指同一个东西。

      但是,其中一些已经具有确定的含义。例如,“元类”在 OO 中,特别是在 Smalltalk 中已经有了一个含义,它的含义与它曾经在 Ruby 中的使用方式不同,这会导致混淆,尤其是考虑到 Ruby 与 Smalltalk 的密切关系。

      同样,“虚拟类”有不同的含义。 (此外,该术语也用于 YARV 源代码中的第三个概念。)

      【讨论】:

      • 大部分我都看过。虚拟课堂意味着不同的东西。在哪里可以阅读元类和虚拟类之间的区别?
      • 在 YARV C 源代码中,“虚拟类”是指属于方法查找链的类,但不被视为对象的类。这些是单例类和包含类(将模块混合到类中时生成的代理类)。更一般地说,虚拟类是可以在子类中覆盖的嵌套类(类似于虚拟方法是可以在子类中覆盖的类的成员)。 Beta(Simula 的继承者)和 Newspeak(Smalltalk 的后裔)有虚拟课程。他们也计划用于 Scala,但被放弃了。
      • 因此,在 Ruby 中,术语“虚拟类”已经被错误地使用,然后开始以不同的错误方式使用。
      • 所以,在 Ruby 级别它只是一个 module?
      • @DarekNędza:虚拟类是嵌套类的特例。 Ruby 两者都没有。不过,您可以通过一个返回类的方法来模拟虚拟类,然后可以在子类中覆盖该类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2016-05-09
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多