Ruby 是否有元对象协议?如果没有,是否可以实现一个?
-
27-09-2019 - |
题
请原谅我的无知,但是什么是元对象协议?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,您所需要做的就是提供允许运行时执行以下操作的函数:
- 创建或删除新类
- 创建新的属性或方法
- 导致一个类从另一个类继承(“更改类结构”)
- 生成或更改定义类方法的代码。
Ruby 提供了一种方法来完成这一切。
附注:Class::MOP 的作者是对的(恕我直言),它声称使用元循环 MOP 可以做的一些事情在 Ruby 中很难做到(免责声明:我有 零、zilch、nada Perl 知识,所以我正在考虑 Smalltalk(例如 MOP)与 CLOS(例如 MOP),但它们中的大多数都是非常具体的(我正在考虑元类实例化)并且有一些方法可以让事情在没有它们的情况下工作。我认为这完全取决于你的观点,元循环 MOP 更酷,但更多的是在学术方面,而非元循环 MOP 更实用且更容易实现。