在Ruby中,术语“元类”,“本征类”和“单例类”是完全同义和可替代的吗?

Class类的文档有一个令人难以置信的混淆图,涉及“元类”。 我试图揭开这里实际发生的事情的神秘面纱。 这三个词都是……

  • 元类
  • eigenclass
  • 单身人士class

Ruby中的 同义词 ? 我知道,元类在Python中意味着特定和不同的东西,例如,但在Ruby中呢?

tl;博士:是的。

在过去,没有人知道该怎么称呼他们,所以每个人都称他们为别的东西。 以下是不同作者随着时间推移使用或提出的名称的一小部分样本:

  • 单身人士class
  • eigenclass
  • 元类
  • 幽灵class
  • 自己的class级
  • 虚拟课
  • 影子课
  • 我的课
  • selfclass
  • 上层阶级
  • 下层阶级
  • anchorclass
  • 嵌入式课程
  • 内在的阶级
  • 先天阶级
  • 无名的课
  • 单元课
  • primefaces类
  • 奇异的阶级
  • 奇点
  • 邦戈class
  • 内心阶级

最初,matz不想选择一个名字,而是希望社区能够选择一个名字。 不幸的是,它没有。 当matz和David Flanagan编写The Ruby Programming Language时 ,他们必须选择,他们选择了本征类 (但是单例方法 )。 Eigenclass也被用于ISO Ruby语言规范的初稿中(但主要是因为一旦找到“官方”版本,就很容易对该名称进行搜索和替换 )。

但是,在后来的草案和ISO Ruby语言规范的最终版本中 ,使用了单例类 。 当最终在Ruby 1.9.2和Module#singleton_class?正式引入Object#singleton_class访问器方法时,也选择了该名称Module#singleton_class? 在Ruby 2.1中引入。

Metaclass是_Why在“ 为什么(Poignant)Ruby指南” (以及其他着作和库)中使用的术语, 它对整整一代非日语Ruby开发人员具有很高的影响力,并且长期以来一直是最好的Ruby元编程的介绍(以及唯一的英文版)。

如今,单例类和本征类似乎主要使用(由于核心库中的方法名称,单例类接管),偶尔提到元类。

就个人而言,我从不喜欢元类,因为它实际上已经有了不同的含义:元类是类的类。 在Ruby中,类有两个定义其行为的类:它们的单例类和Class类,其中任何一个都可以被认为是它们的元类。 (虽然这些类都不能做其他语言中的元类可以做的事情,例如更改方法查找或inheritance的规则。)

虚拟类甚至更成问题,因为它不仅在编程中具有不同的含义(一个可以在子类中重写的嵌套类,例如Beta或Newspeak,并且提议但放弃了Scala),它甚至已经在Ruby社区中第三个不同的含义:virtual class是在MRI和YARV源代码中给出的单例类和包含类的名称。

内部类也已经具有作为嵌套类的同义词的含义(一个类是外部类的成员,就像方法一样)。

就个人而言,我总是喜欢eigenclass,在对称性上已经建立了技术术语,如特征值,特征向量,本征空间,特征函数,特征面,特征波,本征平面,本征态,本征问题等等。但是,我现在采用了单例类这个术语,因为它更容易将singleton_class方法称为返回单例类。

是的,文档似乎使用元类来表示单例类。 图中的每个类都inheritance自元类,其名称与带有一些额外符号的类相同,这也是用于单例类的格式,因此它们必须表示单例类。

是的,他们都是同义词。 Singleton类是最常用的术语,它有一定道理:每个单例类只有一个实例。

就inheritance图而言,我发布了一些可能不那么令人困惑的内容:

对象的Ruby方法查找路径

它们都意味着相同,但我认为官方术语是本征类和单例类。 似乎元类(或元类)由于文档(实际上对源代码的评论)被多人编辑而未在条款上达成共识而潜入。 看起来eigenclass在早期使用得更多,但是由于英国帝国主义社区(其中许多人不理解语素“eigen”)来接管Ruby,单身人士课程变得流行起来。 Matz似乎不想将非英语单词混合到方法名称中,所以自从引入了singleton_class方法以来,单身类似乎变得更加占优势。