最近在学习这个,为什么会有这个设计呢?
每个对象都有一个 Eigenclass,把 class methods 定义在里面。你有一个专属类,不是很好吗?这就是说每个对象都是不同的,可以有不同的方法。Eigenclass 是 Matz 类设计里面非常重要的理念。可以看看《meta programming》这本书
不知道并不影响你写代码,了解了之后可以写出更漂亮的代码
首先我们从 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 里用的是静态方法,逻辑上不能自洽)哪里来的问题。