Ruby eigenclass 的作用是什么?

chenge · 2013年03月20日 · 最后由 ShiningRay 回复于 2013年03月22日 · 2534 次阅读

最近在学习这个,为什么会有这个设计呢?

我看过这书。似乎没说很清楚。

每个对象都有一个 Eigenclass,把 class methods 定义在里面。你有一个专属类,不是很好吗?这就是说每个对象都是不同的,可以有不同的方法。Eigenclass 是 Matz 类设计里面非常重要的理念。可以看看《meta programming》这本书

看来就是用来管理单件方法的。

lz 的意思是没有哪本书解释设计出 eigenclass 的原理?

#6 楼 @chenge 我觉得这就是为了体现一切都是对象,但是又有类和实例的分别而生造出来的概念,学会了有助分析,实际使用中除了几个特殊的地方最好都不用。

用专业词汇来说应该是为了实现 per-instance polymorphism.

#8 楼 @5long 能举例解释一下么?

不知何故,我发现我的发帖不能上首页了?在反馈区。

不知道并不影响你写代码,了解了之后可以写出更漂亮的代码

首先我们从 OOP 的原理讲起

OOP 把要处理的信息抽象成「对象」,把耦合在一起的「状态」(数据结构)和「行为」(算法)封装到一起。那这里出现了两种解决方式,一种是基于类 Class 和基于原型 Prototype 的,Ruby 用的是前者,象 JavaScript 用的是后者。

基于类的 OOP 通过把相似行为和状态抽象成 Class,Class 又可以细化行为状态成为 Subclass 子类 类可以实例化成具体的实例对象 Instance,instance 负责储存对象的状态,而行为即方法则放在 Class 中。

这种概念在 c++,java 里面都运作得很好,但有一些没法自圆其说或者是很麻烦得问题:

有一些对象是唯一的,他自己属于这一类的,比如 TrueClass 只有 true 一个实例。为了解决这个问题,就有了 singleton 模式。这样就很麻烦,如果我有一个类,它的很多实例,但其中只有一两个具有独特的行为,还是必须另外细化出一个类,这就很麻烦。 另一方面,Class 是否是一种对象?当然在 Ruby 中是的,但是以前的很多 OOP 语言中没办法把 Class 当成对象处理。那如果 Class 也是对象,那 Class 自己又该属于哪个 Class?

为了解决这些问题 ruby 便引入了 eigenclass,我习惯叫 metaclass,任何一个对象都包含一个 eigenclassy 来定义唯一对应于它自己的行为,这也是为什么获得 eigenclass 用的是 class << self Self End 这样就解决了实例自身独特行为和 Class 的独特行为(Java 里用的是静态方法,逻辑上不能自洽)哪里来的问题。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号