特異クラスと特異メソッド

以下の3つのコードはすべて同じことをしている。

naoty = Person.new('naoty') # naotyはPersonクラスのインスタンス
def naoty.greet # naotyというインスタンスに特異メソッドを定義
  p 'Hello, my world!'
end

class Person # PersonはClassクラスのインスタンス
  # ...
end
def Person.greet # PersonというClassクラスのインスタンスに特異メソッド(=クラスメソッド)を定義
  p 'Hello, world!'
end
  • あるインスタンスにのみ定義されたメソッドを「特異メソッド」と呼ぶ。
  • すべてのクラスはClassクラスのインスタンスである。
  • ゆえに、クラスメソッドはClassクラスのインスタンスに定義された「特異メソッド」である。
naoty = Person.new('naoty') # naotyはPersonクラスのインスタンス
class << naoty # naotyというインスタンスの特異クラスをオープン
  def greet # 特異クラス内で定義されたメソッドはもちろん特異メソッド
    p 'Hello, my world!'
  end
end

class Person # PersonはClassクラスのインスタンス
  # ...
end
class << Person # PersonというClassクラスのインスタンスの特異クラスをオープン
  def greet # 特異クラス内で定義されたメソッドはもちろん特異メソッド(=クラスメソッド)
    p 'Hello, world!'
  end
end
  • 「特異メソッド」はメソッドであるが、あるインスタンスのみに定義されている。
  • すべてのメソッドはクラスに属する。
  • 「特異メソッド」は「特異クラス」に属する。
class Person
  # ...

  class << self # PersonというClassクラスのインスタンスの特異クラスをオープン
    def greet # 特異クラス内で定義されたメソッドはもちろん特異メソッド(=クラスメソッド)
      p 'Hello, world!'
    end
  end
end
  • クラス定義内のselfはクラスそのものを指すので、上記のように書き換えられる。
  • 「class << self; end;」内で定義されたメソッドは、クラスメソッドとなる。