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

有帮助吗?

解决方案

什么是元对象协议?

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

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

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

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

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


鲁比有吗?

根据这个线程 重新打开内置类,重新定义内置函数? 佩尔蒙克斯 文章我认为答案是 (至少从严格意义上的 MOP 来看)。

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

其他提示

如果你仔细观察定义,你会发现 Ruby 确实有 一个拖把。是不是像CLOS里的那样?不,CLOS 是 超圆MOP 这很棒(我什至会说天才),但这不是唯一真正的方法,看看 短暂聊天. 。要实现(假设是基本的)MOP,您所需要做的就是提供允许运行时执行以下操作的函数:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top