2010-10-31 54 views
5

请原谅我的无知,但是什么是Metaobject协议,Ruby有没有?如果没有,是否有可能为Ruby实现一个?如果Ruby有一个功能,Metaobject协议可能具备哪些功能?Ruby是否具有Metaobject协议?如果不是,是否可以实现?

+0

对此有帮助吗? http://stackoverflow.com/questions/1061908/scoping-of-open-classes-in-ruby-versus-mop-in-groovy – zengr 2010-10-31 09:15:13

+0

你从哪里听到“Metaobject”这个词? – 2010-10-31 23:13:59

+1

@Andrew,CLOS:http://www.lisp.org/mop/concepts.html – horseyguy 2010-10-31 23:41:38

回答

1

什么是Metaobject协议?

最佳描述我已经遇到是从Class::MOP文档:

甲元对象协议是为一个对象系统的API。

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

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

所有对象系统都有隐式MOP。没有人,他们不会工作。显式的MOP更不常见,并且取决于语言可以从限制性(Java或C#中的Reflection)到全开(CLOS是一个很好的示例)。


红宝石是否有一个?

根据这个线程Reopening builtin classes, redefining builtin functions?Perlmonks文章中,我想答案是没有(至少在一个MOP就是严格意义上的)。

显然这里有一些蠕动的空间,所以它可能值得在SO的Perl端发布一个问题,因为Class::MOP/Moose作者确实回答questions there

+2

感谢您的信息,然而阅读第一个链接“重建内建类......”看起来作者确实获得了大量的他的Ruby评论是错误的,这破坏了他的观点。大多数他声称在Ruby中难以或不可能完成的事情在Ruby中非常容易实现。我很想看到由精通Ruby和Perl的人编写的类似性质的文章:)谢谢! – horseyguy 2010-11-01 20:54:36

0

如果你看起来更接近定义,你会发现Ruby 的确有一个MOP。它是否像CLOS中的那个?不,CLOS是元圆形澳门币这是伟大的(我甚至说天才),但它不是一个真正的方式,看看Smalltalk。要实现(比方说基本)MOP所有你需要的是提供的功能,让您的运行时:

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

而Ruby提供了一种方法来完成所有这些。

附注:Class :: MOP的作者是正确的(恕我直言),当它声称你可以用元圆形MOP做的一些事情在Ruby中很难做到(免责声明:我有零,zilch,nada Perl的知识,所以我正在考虑像MOP这样的Smalltalk与像MOP这样的CLOS),但其中大多数都非常具体(我正在考虑metaclass instantation),并且有办法让它们在没有它的情况下工作。我认为这一切都取决于你的观点,元圆形MOP更酷,但在学术方面更多,非元圆形MOP更实用,更易于实施。

相关问题