LoginSignup
5
5

More than 5 years have passed since last update.

Rubyにクラスメソッドなんてなかった

Posted at

「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のようには使えない
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5