LoginSignup
3
0

More than 5 years have passed since last update.

インスタンスメソッド・クラスメソッド・特異メソッド

Last updated at Posted at 2018-07-18

はじめに

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
=> []

まとめ

インスタンスメソッド : インスタンスのみが実行できるメソッド
クラスメソッド : クラスオブジェクトのみが実行できるメソッド、クラスオブジェクトが固有に持っている特異メソッドでもある。
特異メソッド : オブジェクトが固有に持つメソッド

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0