※2022年から技術系の記事は個人ブログに投稿しております。ぜひこちらもご覧ください→yamaday0u Blog
クラスメソッドとインスタンスメソッドの違い
まずRubyのクラスメソッドとインスタンスメソッドの違いを見ていきます。
クラスメソッドとは
クラスメソッドを定義したクラス自身が使用できます。クラスで共通の情報を使った処理に使用します。インスタンスがなくても呼び出すことができます。
クラスメソッドを定義する際は、self.メソッド名
と記述します。以下のようにクラス名Fruits
から呼ぶことができます。また、インスタンスを生成するnew
メソッドは、代表的なクラスメソッドです。
calss Fruits
def self.call #selfはクラス自身を指す
puts "クラスメソッドを呼び出しました"
end
end
Fruits.new #newメソッドもクラスメソッドの1つ。
Fruits.call
ターミナルで上記のrubyファイルを実行すると次のような結果になります。
ruby fruits.rb
クラスメソッドを呼び出しました
Fruits.callの実行結果が表示されます。
Fruits.newは空のインスタンスが生成されるだけなので実行結果には表示されません。
###インスタンスメソッドとは
インスタンスが使用できるメソッドで、クラス内に定義します。
「インスタンスメソッドを定義したクラス」から生成されるインスタンスが使用できます。
calss Fruits
def call
puts "インスタンスメソッドを呼び出しました"
end
end
fruits = Fruits.new
fruits.call
#.でつなげて下記のように呼び出すこともできます。
Fruits.new.call
ruby fruits.rb
インスタンスメソッドを呼び出しました
initializeメソッド
initialize
メソッドは、new
メソッドによってインスタンスを生成したと同時に実行される処理を定義できるインスタンスメソッドです。
実は、クラスに記述しなくてもinitialize
メソッドは自動で実行されており、この場合は何も処理がされません。
class Fruits
def initialize
puts "インスタンスが生成されました"
end
end
Fruits.new
ターミナルで上記のrubyファイルを実行すると次のような結果になります。
ruby fruits.rb
インスタンスが生成されました
Fruits.new
でインスタンスを生成した後にinitialize
メソッドに定義した処理が実行されたことがわかります。
クラス変数とインスタンス変数の違い
次にクラス変数とインスタンス変数の違いを見ていきます。
クラス変数とは
そのクラス内で定義される変数で、@@変数名
と記述して定義します。クラス変数は、クラスとして共通の変数を定義したいときに使うのに適しています。
class Fruits
@@fruit = "オレンジ" #initializeメソッド内で使用するために、インスタンス生成前に定義
def initialize
puts "私は#{@@fruit}が好きです"
end
end
Fruits.new
実行結果
ruby fruits.rb
私はオレンジが好きです
クラスメソッドの特徴として、一度定義すればクラス内のどこでも使用することができます。
class Fruits
@@price = 0
def initialize(fruit, price)
@fruit = fruit
@@price += price
end
def self.sum
puts "合計金額は#{@@price}円です"
end
end
Fruits.new("オレンジ", 200)
Fruits.new("リンゴ", 300)
Fruits.new("ぶどう", 500)
Fruits.sum
ruby fruits.rb
合計金額は1000円です
オレンジ、リンゴ、ぶどうのインスタンスを生成するたびにクラス変数@@price
に各フルーツの価格が合算され、sum
メソッドで合計金額を出力しました。
インスタンス変数とは
個別のインスタンスに定義できる変数で、@変数名
と記述して定義します。インスタンス変数は定義したインスタンスメソッドとは別のインスタンスメソッドの中でも使用することができます。
class Fruits
def initialize(fruit)
@fruit = fruit
puts "私は#{@fruit}が好きです"
end
def dislike
puts "私は#{@fruit}が苦手です"
end
end
Fruits.new("オレンジ")
Fruits.new("リンゴ")
fruit = Fruits.new("ぶどう")
fruit.dislike
ruby fruits.rb
私はオレンジが好きです
私はリンゴが好きです
私はぶどうが好きです
私はぶどうが苦手です
initialize
メソッドで、生成したインスタンスごとにインスタンス変数@fruit
の値が代入され、putsで出力しています。
また、initialize
メソッド で定義したインスタンス変数@fruit
がdislike
メソッドでも使用できているのが確認できます。