该class << self
符号打开了对象的特征类。eigenclass 是一个匿名类,它存储特定于实例的行为。在类的情况下,特征类有时称为元类。
Ruby 使用特征类来实现所谓的“类方法”(也称为静态方法)。
一个类(如 moritz 所说)在 Ruby 中也是一个对象,就它是一个对象而言,它也有一个类。Ruby 中类的类称为Class
.
任何语言中的“类方法”都是以类为接收者的方法——即直接在类本身上调用该方法。
但是,为了在接收器上调用方法,必须在该接收器的类上定义该方法。在类的情况下,“类方法”可以作为类的实例方法来实现Class
。
但是在 on 上定义实例方法Class
意味着所有类都可以访问该类方法,这并不理想。
输入特征类,如前所述,对象的特征类是一个特殊的类,它存储该对象独有的方法。在类的情况下,本征类是该类的子Class
类,并且是该类的直接类。
因此,Ruby 中的“类方法”只是在类的特征类上定义的“实例方法”。
该def MyClass.my_method
符号实际上是my_method
在 MyClass 的特征类上定义的。如果您使用这种表示法,您可以(暂时)在没有真正理解特征类的情况下通过,因为您可以欺骗自己认为这只是 Ruby 定义“静态方法”的方式,并继续认为 Ruby 的类模型类似于 Java。然而,class << self
符号不允许这样的解释,你必须接受特征类的现实。
总之,“类方法”实际上是在特征类上定义的“实例方法”,它class << self
使您可以访问特征类。
如需更多阅读,请查看以下链接:
http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/
http://banisterfiend.wordpress.com/2008/10/25/the-secret-life-of-singletons/
http://www.klankboomklang.com/2007/09/21/the-singleton-class/