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

Max*_*tor 3 ruby

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

  • 元类
  • eigenclass
  • 单身课程

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

Jör*_*tag 16

tl;博士:是的.

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

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

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

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

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

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

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

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

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

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

  • @MaxCantor,是的. (2认同)