以下「メタプログラミングRuby」で勉強したことです。
特異メソッドとは
特定のオブジェクトに対して定義されたメソッドのこと。
wareki = "heisei"
def wareki.is_reiwa?
self == "reiwa"
end
wareki.is_reiwa? #=>false
ここで定義したwareki.is_reiwa?はStringクラスの他のオブジェクトに影響を及ぼすことはない。warekiというオブジェクト(正確には"heisei")に対してのみ適用されるメソッドである。
特異とは普通と異なり特別なことだ。特異メソッドはその言葉通り、普通のメソッドとは異なり、特別に定義されたメソッドのことだ。
(英語ではsingular methodと呼称されている。singularには「個別の」という意味があるので、「個別に定義されたメソッド」と理解する方がしっくり来るかもしれない)
クラスメソッドと特異メソッドの関係
class Hoge
def self.class_method_a
puts "class_method_a"
end
end
Hoge.class_method_a #=> "class_method_a"
rubyを少しでも触ったことのある人なら、上のコードが何をやっているかわかるだろう。
Hogeクラスにclass_method_aクラスメソッドを定義している。
これを先の特異メソッドと見比べてみてほしい。
「なんか似てない?」
実はクラスメソッドも一種の特異メソッドなのだ。
「え?でも特異メソッドってオブジェクトに対して定義するものじゃないの?」
「クラスってオブジェクトじゃなくね?」
と思うかもしれないが、実はクラスもオブジェクトだ(ややこしい)。
もっとややこしい言い方をすると「HogeクラスはClassクラスのオブジェクト」だ。
クラスメソッド = Hogeクラス(Classクラスの「オブジェクト」)に定義されたメソッド
特異メソッド = 特定のオブジェクトに対して定義されたメソッド
クラスメソッド == 特異メソッド
以上のことからクラスメソッドも特異メソッドの一種なのだ。