Uncategorized

クラスメソッド(self)について

Rubyの基礎知識をあまり理解せずに使っていたことを実感する機会があったので、改めて勉強し直したいと思います。

今日はクラスメソッド(self)について整理していきます。

クラスメソッドとインスタンスメソッド

クラスメソッドを理解するには、インスタンスメソッドについても理解しなければいけません。

Rubyのクラスの中で作るメソッドは2種類あり、それがクラスメソッドインスタンスメソッドです。

それぞれの定義は以下のようになっています。


2つの違いは、「インスタンスをレシーバとするメソッド」と「クラスをレシーバとするメソッド」です。

ゼロからわかるRuby超入門 p203

* ちなみにインスタンスとは、クラスから作ったオブジェクトのことを言います。

クラスメソッドの例

class User
end

User.new

このUser.newがクラスメソッドです。

インスタンスメソッドの例

class User
  def name
    puts "Alice"
  end
end

user = User.new
user.name #=> Alice

Userクラスの中に作成したnameメソッドがインスタンスメソッドになります。

クラスメソッドの使い道

ここまで見る限り、「クラスメソッドはクラス名.newでしか使わないのかな?」と思われる方が多いでしょうが、他にも使う機会があります。

どういうときに使うのかと言うと、

一方、そのクラスに関連は深いものの、ひとつひとつのインスタンスに含まれるデータは使わないメソッドを定義したい場合もあります。そのような場合はクラスメソッドを定義した方が使い勝手が良くなります。

プロを目指す人のためのRuby入門 改訂2版 p247

たしかにインスタンスメソッドを使う必要がない場合も出てきますよね。

では、どうやってクラスメソッドを定義するのか?という疑問が出てきます。
定義する方法は簡単でクラス名.self で定義することができます

以下に例をあげます。

class Team
  def self.favorite(team)
    "My Team is #{team}"
  end
end

team = 'Arsenal'
Team.favorite(team) #=> "My Team is Arsenal"

このようにインスタンスメソッドを使う必要がないときはクラス名.self を使ってクラスメソッドを使った方がシンプルになります。