Rubyのリファレンスを見るとよく特異メソッドという言葉が出てくるので調べました。
クラスメソッドとも関連があるため併せて記載します。
動作確認環境 ruby 3.0.0p0
特異メソッド
まずはリファレンスから。
特異メソッドとはクラスではなくある特定のオブジェクトに固有のメソッドです。特異メソッドの定義はネストできます。
クラスの特異メソッドはそのサブクラスにも継承されます。言い替えればクラスの特異メソッドは他のオブジェクト指向システムに>おけるクラスメソッドの働きをすることになります。
特異メソッド定義式は、メソッド名を Symbol にしたオブジェクトを返します。
Rubyはオブジェクトに対して固有のメソッドを定義できるみたいですね。
犬のしつけに例えてサンプルコードを試してみました。
class Dog
def bark
'わんわん'
end
end
pochi = Dog.new
taro = Dog.new
# pochiにお手をしつけ
def pochi.ote
'わん!(お手をする)'
end
# pochi
pochi.bark # => "わんわん"
pochi.ote # => "わん!(お手をする)"
# taro
taro.bark # => "わんわん"
taro.ote # => undefined method `ote` for #<Dog:0x00007fdb1fb2a730>
# お手してくれない。。
def pochi.ote
のようにdef obj.method_name
と書くことで、objに対してメソッドを追加することができる。
このようにオブジェクト特有のメソッドを特異メソッドというみたいです。
クラスメソッド
Rubyのクラスメソッドは特異メソッドを応用しています。
クラスメソッドはself.method_name
という形式で書くことが多いと思います。
def User
def self.adult_age
20
end
end
selfはクラス自身を指すので、Userに置き換えられます。
def User
def User.adult_age
20
end
end
この形をみると、Userオブジェクトに特異メソッドが追加されたことになります。
「あれ、Userはオブジェクトではないのでは?」と疑問が浮かんで調べてところ、実はUserはClassクラスのオブジェクトになります。
User.class
=> Class
参考:プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus 8.5.7 クラスやモジュール自身もオブジェクト
つまり、クラスメソッドとして使っているself.method_name
の形式は自身のクラスの特異メソッドを定義していることになります。
これにより、Rubyはクラスメソッドを実現しているみたいです。
参考サイト
以下参考にさせていただきました。
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus
8.5.7 クラスやモジュール自身もオブジェクト