Rubyの基礎知識をあまり理解せずに使っていたことを実感する機会があったので、改めて勉強し直したいと思います。
今日はクラスメソッド(self)について整理していきます。
クラスメソッドとインスタンスメソッド
クラスメソッドを理解するには、インスタンスメソッドについても理解しなければいけません。
Rubyのクラスの中で作るメソッドは2種類あり、それがクラスメソッドとインスタンスメソッドです。
それぞれの定義は以下のようになっています。
ゼロからわかるRuby超入門 p203
2つの違いは、「インスタンスをレシーバとするメソッド」と「クラスをレシーバとするメソッド」です。
* ちなみにインスタンスとは、クラスから作ったオブジェクトのことを言います。
クラスメソッドの例
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 を使ってクラスメソッドを使った方がシンプルになります。