在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
方法以来,单身类似乎变得更加占优势。