【问题标题】:Does Ruby have a Metaobject protocol and if not, is it possible to implement one?Ruby 是否有 Metaobject 协议,如果没有,是否有可能实现一个?
【发布时间】:2011-05-02 23:21:01
【问题描述】:

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

【问题讨论】:

标签: ruby mop metaobject


【解决方案1】:

什么是元对象协议?

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

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

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

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

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


Ruby 有吗?

根据Reopening builtin classes, redefining builtin functions?Perlmonks 文章上的这个帖子,我认为答案是(至少在最严格意义上的 MOP 是什么)。

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

【讨论】:

  • 感谢您提供的信息,但是阅读第一个链接“Reopining builtin classes...”看来作者确实得到了大量的 Ruby 评论错误,这确实破坏了他的观点。他所说的大部分在 Ruby 中很难或不可能做到的事情实际上在 Ruby 中很容易做到。我希望看到由精通 Ruby 和 Perl 的人撰写的类似性质的文章 :) 不过谢谢!
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多