このclass << self
表記は、オブジェクトの固有クラスを開きます。固有クラスは、インスタンス固有の動作を格納する匿名クラスです。クラスの場合、固有クラスはメタクラスと呼ばれることがあります。
Ruby は固有クラスを使用して、いわゆる「クラス メソッド」(静的メソッドとも呼ばれます) を実装します。
クラス (モリッツが述べたように) は 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/