「RubyでのクラスメソッドはClassオブジェクトのインスタンスメソッドだった」という事実に衝撃を受けたのでメモします。
クラスメソッドはClassオブジェクトのインスタンスメソッドだった
クラスメソッドはだいたい以下の方法で定義するかと思います。
class MyClass
def self.method1
p “method1 called!”
end
def MyClass.method2
p “method2 called!”
end
class << self
def method3
p “method3 called!”
end
end
end
MyClass.method1 # => "method1 called!"
MyClass.method2 # => "method2 called!"
MyClass.method3 # => "method3 called!"
ここでこの定義方法や使い方を眺めてると、まさしく”MyClassというClassオブジェクトのインスタンスメソッド”なんですよね。特異メソッドや特異クラスを使用して定義しています。
特異メソッドや特異クラスについてはこちらに詳しく載せられています。
http://blog.livedoor.jp/sasata299/archives/51497378.html
じゃあ、Classオブジェクトのprivateインスタンスメソッドは?
ここまでのように、クラス定義の外でメソッドを呼べるのはそのメソッドがpublicであったためです。では、privateで定義するとどうなるのでしょうか?
class MyClass
class << self
def method3
p “method3 called!”
end
private
def method4
p “method4 called!”
end
end
method3 # => “method3 called!”
method4 # => “method4 called!”
end
MyClass.method3 # => “method3 called!”
MyClass.method4 # => Error
privateだとクラス外では使用できませんが、クラス内で使用できます。
attr_accessorなどのメソッドもこれで定義できるようになります。
まとめ
- クラスAのクラスメソッドはAというClassオブジェクトのインスタンスメソッド
- このメソッドはクラスAの定義中に直に記述できる
- privateだとクラスAの定義外でA.method1のようには使えない