特異クラスと特異メソッド
以下の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;」内で定義されたメソッドは、クラスメソッドとなる。