インスタンスメソッド、クラスメソッド、特異メソッドの違いについてまとめてみました!!
インスタンスメソッドとは?
- インスタンスから呼べるメソッドのこと
定義の仕方と解説
Human.instance_methods.grep(/say_hello/)でメソッドがあることがわかるのでインスタンスメソッド ## クラスメソッドとは? - クラスから呼べるメソッドのこと定義の仕方と解説1
定義の仕方と解説2
クラスメソッドのselfはクラスそのものです。
厳密にいうとselfが書かれた場所に参照するレシーバを返します。
selfの代わりにクラス名をそのまま使ってもクラスメソッドになります。
Human.methods.grep(/say_hello/)でメソッドがあることがわかるのでクラスメソッド
Human.singleton_methods.grep(/say_hello/)でメソッドがあることがわかるので特異メソッド(シングルトンメソッド
上記の検証からクラスメソッドは特異メソッドであることがわかります。
## 特異メソッド(シングルトンメソッド)とは?
- 1つのオブジェクト固有のメソッド
- クラスメソッドは特異メソッド
特異メソッドがオブジェクト固有のメソッドとは?
- オブジェクト固有とはオブジェクトIDが同じということ
- インスタンスのオブジェクトIDは一つ一つ違う
コードで説明
- インスタンスのobject_idをみるとそれぞれ違う。クラス、モジュールは同じ
- classメソッドはオブジェクトのクラスが確認できる
- ancestorsメソッドは継承関係を確認できる
- object_idは各オブジェクトに対して一意な整数を確認できる
class Human
end
p BasicObject.class
=> Class
p BasicObject.ancestors
=> [BasicObject]
p BasicObject.object_id
=> 580
p BasicObject.object_id
=> 580
BasicObjectはnewメソッドがなくインスタンス化できない
❌ p BasicObject.new.object_id
❌ p BasicObject.new.object_id
p Kernel.class
=> Module
p Kernel.ancestors
=> [Kernel]
p Kernel.object_id
=> 600
p Kernel.object_id
=> 600
Kernelはモジュールのためnewメソッドがなくインスタンス化できない
❌ p Kernel.new.object_id
❌ p Kernel.new.object_id
p Object.class
=> Class
p Object.ancestors
=> [Object, Kernel, BasicObject]
p Object.object_id
=> 60
p Object.object_id
=> 60
p Object.new.object_id
=> 620
p Object.new.object_id
=> 640
p Human.class
=> Class
p Human.ancestors
=> [Human, Object, Kernel, BasicObject]
p Human.object_id
=> 660
p Human.object_id
=> 660
p Human.new.object_id
=> 680
p Human.new.object_id
=> 700