クラスメソッドを定義するときのコードで出てくる class << self
class Foo
class << self
def bar
:bar
end
end
end
p Foo.bar
class << self
は特異クラスの定義(オープン)の文法。
覚え方として、classキーワードはいつも通りの使い方で、 <<
が後ろにつづくオブジェクトの特異クラスを示す文法。ここではselfはFooなので、Fooクラスの特異クラスをclassキーワードでオープンしていると考えれば良い。
なんとなくですが、
で、記法としては継承と特異クラスオープンはとても似ているんですよね。そういう観点で見ると、
class Singleton << Origin
記法にはそれほど違和感がないように思います(記法が似ているのも、クラスに対しての関係性を設定するという機能上の類似によるものな気がします)。ただ、実際にはクラスメソッドの定義に使われるという関係上、
class Singleton << self
の書き方になる場合が多く、こうなるとなんだか不思議な見た目になってしまいます。結局、"class クラス名 関係性指定 関係対象"の記法のうち、関係性指定が特異クラスで関係対象が
self == Origin
だという風に認識するといいのかな、なんて思いました。