6

请原谅我的无知,但什么是元对象协议,Ruby 有吗?如果没有,是否可以为 Ruby 实现一个?如果 Ruby 拥有一个 Metaobject 协议,它可能拥有哪些特性?

4

2 回答 2

2

什么是元对象协议?

我遇到的最好的描述来自Class::MOP文档:

元对象协议是对象系统的 API。

更具体地说,它抽象了对象系统的组件(类、对象、方法、对象属性等)。然后可以使用这些抽象来检查和操作它们描述的对象系统。

可以说,任何对象系统都有两个 MOP;隐式 MOP 和显式 MOP。隐式 MOP 处理诸如方法分派或继承之类的事情,这些事情作为对象系统工作方式的一部分自动发生。显式 MOP 通常处理对象系统的内省/反射特性。

所有对象系统都有隐含的 MOP。没有一个,他们将无法工作。显式 MOP 不太常见,并且根据语言的不同,可以从限制性(Java 或 C# 中的反射)到广泛开放(CLOS 是一个完美的例子)。


鲁比有吗?

根据这个线程重新打开内置类,重新定义内置函数? Perlmonks文章我认为答案是否定的(至少在最严格意义上的 MOP 是什么)。

显然这里有一些回旋余地,因此可能值得在 SO 的 Perl 方面发布一个问题,因为Class::MOP/ Moose作者确实在那里回答了问题

于 2010-11-01T14:50:55.430 回答
2

如果您仔细查看定义,您会发现 Ruby确实有一个 MOP。和CLOS里的一样吗?不,CLOS 是一个很棒的元循环 MOP(我什至会说天才),但这不是真正的方法,看看Smalltalk。要实现(假设是基本的)MOP,您只需要提供允许您的运行时执行以下操作的函数:

  1. 创建或删除新课程
  2. 创建新的属性或方法
  3. 导致一个类从不同的类继承(“改变类结构”)
  4. 生成或更改定义类方法的代码。

Ruby 提供了一种方法来完成这一切。

附带说明:Class::MOP 的作者是对的(恕我直言),它声称您可以使用元循环 MOP 做的一些事情在 Ruby 中很难做到(免责声明:我有零,zilch,nada Perl 知识,所以我认为 Smalltalk 像 MOP 与 CLOS 像 MOP 在这里)但它们中的大多数都是非常具体的(我在这里考虑元类实例化)并且有一些方法可以在没有它们的情况下使事情正常工作。我认为这完全取决于您的观点,元圆形 MOP 更酷,但在学术方面更多,而非元圆形 MOP 更实用且更易于实施。

于 2017-07-11T13:16:53.387 回答