シングルトンクラスについて、すぐに忘れるので、メモしておく。
この内容はメタプログラミングRubyに書いている内容です。
ここでは、特異クラス=シングルトンクラスのこと。
シングルトンパターンのシングルトンの意味合いではない。
シングルトンメソッド
オブジェクト固有のメソッドを以下のように定義することができる。
class C
end
c = C.new
#シングルトンメソッド定義
def c.singleton_method_method_test
p "singleton_method_test"
end
c.singleton_method_test
このメソッドは、シングルトンクラスに定義される。
シングルトンクラスは、オブジェクトとクラスの間に位置する存在である。
c.singleton_class.instance_methods(false)
#ここにいる
[:singleton_method_test]
クラスメソッドへの応用
クラスメソッドも、これと同じ仕組みで定義されている。
class C
def self.class_method_test
p "class_method_test"
end
end
C.singleton_class.instance_methods(false)
=> [:class_method_test]
あるオブジェクトからメソッドを呼び出すときは、以下のようなメソッドのたどり方になる。
オブジェクトからシングルトンクラスを(一度)参照し、その後シングルトンクラスから継承チェーンをsuperclassによって辿ってメソッドを探していく。