はじめに
irbでテスト用にクラスを作成して各メソッドについて確認しました。
ちなみに、特異メソッドとはオブジェクトが固有に持つメソッドのことです。
確認に利用するメソッド
オブジェクト.methods : メソッド名を配列で返す。
オブジェクト.singleton_methods : 特異メソッド名を配列で返す。
テスト用クラスの作成
irbで以下のクラスを作成しましょう。
class Test
# クラスメソッド(1)
class << self
def hoge1
p "hoge1"
end
end
# クラスメソッド(2)
def Test.hoge2
p "hoge2"
end
# クラスメソッド(3)
def self.hoge3
p "hoge3"
end
# インスタンスメソッド
def hoge4
p "hoge4"
end
end
Testクラスをインスタンス化してオブジェクトを生成・インスタンスに特異メソッドを追加します。
hoge = Test.new
fuga = Test.new
# 特異メソッド
def hoge.hoge5
p "hoge5"
end
各メソッドの確認
以下のようにコマンドを実行して各メソッドを確認していきましょう。
Testクラスのメソッドにhoge4(インスタンスメソッド)とhoge5(特異メソッド)は含まれていない
インスタンスメソッドを実行するとエラーが発生します。
irb(main)> Test.methods
=> [:hoge3, :hoge2, :hoge1,...(省略)]
irb(main)> Test.hoge1
"hoge1"
=> "hoge1"
irb(main)> Test.hoge4
Traceback (most recent call last): ...(省略)
インスタンスhogeのメソッドはhoge4(インスタンスメソッド)とhoge5(特異メソッド)となっています。
クラスメソッドを実行するとエラーが発生します。
irb(main)> hoge.methods
=> [:hoge5, :hoge4,...(省略)]
irb(main)> hoge.hoge5
"hoge5"
=> "hoge5"
irb(main)> hoge.hoge1
Traceback (most recent call last): ...(省略)
インスタンスfugaのメソッドはhoge4(インスタンスメソッド)となっており、hoge5(特異メソッド)は実行できません。
irb(main)> fuga.methods
=> [:hoge4,...(省略)]
fuga.hoge4
"hoge4"
=> "hoge4"
fuga.hoge5
Traceback (most recent call last): ...(省略)
特異メソッドの確認
Testクラスの特異メソッドを確認すると、Testクラスのクラスメソッドが返ります。
これは、クラスメソッドがTestクラスオブジェクトの固有のメソッド(特異メソッド)であるためです。
irb(main)> Test.singleton_methods
=> [:hoge3, :hoge2, :hoge1]
次にインスタンスhogeの特異メソッドを確認します。
以下のコマンドを実行するとhoge5が返ります。
irb(main)> hoge.singleton_methods
=> [:hoge5]
fugaには固有のメソッド(特異メソッド)は存在しません。
irb(main)> fuga.singleton_methods
=> []
まとめ
インスタンスメソッド : インスタンスのみが実行できるメソッド
クラスメソッド : クラスオブジェクトのみが実行できるメソッド、クラスオブジェクトが固有に持っている特異メソッドでもある。
特異メソッド : オブジェクトが固有に持つメソッド