🐕
Ruby クラスメソッドとインスタンスメソッドの違い
はじめに
クラスメソッドとインスタンスメソッドの違いがいまいち明確ではなかったので備忘録として記事化してみます。
クラスメソッド
クラスに対して直接呼び出すことができるメソッドで、クラス全体に関わるデータの変更・参照を行う際に使うメソッド。
例えば、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