🐕

Ruby クラスメソッドとインスタンスメソッドの違い

2022/09/03に公開

はじめに

クラスメソッドインスタンスメソッドの違いがいまいち明確ではなかったので備忘録として記事化してみます。

クラスメソッド

クラスに対して直接呼び出すことができるメソッドで、クラス全体に関わるデータの変更・参照を行う際に使うメソッド。
例えば、Userクラスがあったとして、

class User
  @@count = 0

  def initialize
   @@count += 1
  end

  def self.users_count
    puts "現在のユーザー数は#{@@count}人です"
  end
end

User.new
User.new
User.new
User.users_count # インスタンスメソッドの場合、 「.new」でインスタンスを作成する必要がある。

=> 現在のユーザー数は3人です

このような形式でクラスを直接レシーバーとしてメソッドを呼び出すことができる。
また、使い所としてはクラス全体のインスタンス数のようなクラス全体関わる情報の変更・参照を行う場合に便利。

クラスメソッドの定義の仕方としては、

def self.hoge
  puts 'hoge'
end

のようにメソッド名の前にselfをつけるか、

class User
  class << self
    def hoge
      puts 'hoge'
    end
    
    def fuga
      puts 'fuga'
    end
  end
end

とする方法があり、前者の方が手軽ではあるが、クラスメソッドの数が多い場合などでは後者の方が可読性があがることもあるので使い分けるのが良さそう。

インスタンスメソッド

こちらは通常の(?)メソッド定義になります。

class User
  attr_accessor :first_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    puts "私の名前は#{first_name + last_name}です。"
  end
end

user = User.new('yamada', 'taro')
user.full_name

=> 私の名前はyamadataroです。

上記のようにインスタンスをレシーバとしてメソッドを呼び出すことになります。
(クラスをレシーバにした場合はエラーになって呼び出せません)

個別のインスタンスの情報を変更・参照する場合に使います。

つまりはクラスメソッドはクラス全体の情報を読み書きする場合に、インスタンスメソッドは個別に作成されたインスタンスの情報を読み書きする場合に使われる仕組みになるのだと思います。

以上でございやす。

Discussion