今回は、クラスに定義できる2種類のメソッド「クラスメソッド」と「インスタンスメソッド」について解説したいと思います。Rubyを学習し始めてつまずきやすいポイントの1つだと思うので、丁寧に進めていきましょう。
クラスメソッドとは
クラスが使用できるメソッドです。クラスメソッドを定義したクラス自身が使用でき、クラスで共通の情報を持った処理に使用します。
定義方法と呼び出し
class クラス名
def self.メソッド名
# 実行したい処理
end
end
クラス名.メソッド名(引数)
クラスメソッドはメソッド名の前に「self.」を付けます。
インスタンスメソッドとは
インスタンスが使用できるメソッドです。インスタンスメソッドを定義したクラスのインスタンスに使用でき、インスタンス毎の個別の情報を使った処理に使用します。
定義方法と呼び出し
class クラス名
def メソッド名
# 実行したい処理
end
end
インスタンス.メソッド名(引数)
具体例
先ほどの説明だけではピンとこないと思うので、例題を見ながら確認していきましょう。
下のコードを見てください。「House」というクラスに、「price」というクラスメソッドとインスタンスメソッドがそれぞれ定義されていますね。
class House
def self.price
puts "1000万円です(クラスメソッド)"
end
def price
puts "1000万円です(インスタンスメソッド)"
end
end
まずは、クラスメソッドを呼び出してみます。以下のように記述すると、クラスメソッドが呼び出されます。
House.price
# => 1000万円です(クラスメソッド)
次にインスタンスメソッドを呼び出してみます。以下のように記述すると、インスタンスメソッドが呼び出されます。
house = House.new
house.price
# => 1000万円です(インスタンスメソッド)
クラスメソッドとインスタンスメソッドの使い分け
クラスメソッドとインスタンスメソッドの使い分けですが、「クラスメソッドは全体で扱うべき情報を扱う」、「インスタンスメソッドは個々で扱うべき情報を扱う」といった感じです。
先ほどと同様に例を見ていきましょう。とあるスーパーマーケットの情報を表示するアプリケーションがあると仮定します。
そして、そのスーパーマーケットの評判(rate)をクラスで定義し、それに基いて評判(rate)のインスタンスを生成して管理することにします。
そうすると、以下のように定義することができます。
class Rate
def self.rate_count
return 0 # ここでは便宜上0を返すことにします
end
def show_rate
puts "品揃え最高!"
end
end
puts Rate.rate_count
# => 0
rate = Rate.new
rate.show_rate
# => 品揃え最高!
評判の数(rate_count)は全体で扱うべき情報なのでクラスメソッド、評判内容(show_rate)は個々で扱うべき情報なのでインスタンスメソッドと使い分けていることが分かりますね。
まとめ
- クラスメソッドは、クラスが使用できるメソッド
- インスタンスメソッドは、インスタンスが使用できるメソッド
- クラスメソッドは全体で扱うべき情報を扱い、インスタンスメソッドは個々で扱うべき情報を扱う
最後に
クラスメソッドとインスタンスメソッドには前述で説明したような違いがありましたが、正直どちらで書いても実装はできます。
加えて、インスタンスメソッドには色々なデータを加えることができるので、できればインスタンスメソッドで記述することをおすすめします。
今回は、クラスに定義できる2種類のメソッド「クラスメソッド」と「インスタンスメソッド」について解説しました。1回ではすぐに理解できない箇所だと思うので、他の記事や参考書も読み返しながら、徐々に理解を深めていってください。