#はじめに
本来、クラスメソッドとして定義するべき所をインスタンスメソッドで定義してしまっていたので、変更を行った。
#インスタンスメソッド(例)
・インスタンスメソッドの定義
app/models/hoge_fuga.rb
class HogeFuga
def method_name
puts "インスタンスメソッドが呼び出される"
end
end
・インスタンスメソッドの呼び出し
app/controllers/piyo_controller.rb
class PiyoController < ApplicationController
def piyo
hogefuga = new.HogeFuga # インスタンス生成
hogefuga.method_name #=> "インスタンスメソッドが呼び出される"
end
end
インスタンスメソッドの場合は、
「newメソッド」で、インスタンスを作ってから、
インスタンス名.method_name
ですね。
#クラスメソッド(例)
・クラスメソッドの定義
app/models/hoge_fuga.rb
class HogeFuga
def self.method_name
puts "クラスメソッドが呼び出される"
end
end
クラスメソッドの定義はメソッド名の前に「self.」を付けます
・クラスメソッドの呼び出し
app/controllers/piyo_controller.rb
class PiyoController < ApplicationController
def piyo
HogeFuga.method_name #=> "クラスメソッドが呼び出される"
end
end
#クラスメソッドにすべき場合
- まず、initializeメソッドで初期化を行う処理が含まれていない場合。
##initializeメソッド(例)
class Phone
attr_accessor :name, :version
def initialize(name, version)
self.name = name
self.version = version
end
def suggestion
puts "#{self.name}#{self.version}を使ってみませんか?"
end
end
phone = Phone.new("iPhone", "X")
phone.suggestion
#=> iPhoneXを使ってみませんか?
このような初期化の処理がない場合に加えて、
- インスタンスごとに固有の処理が行われない場合
上記のような場合は、インスタンスを生み出す必要のあるクラスではないと判断してクラスメソッドを使った方が、分かりやすい。
逆にそれ以外は、基本的にインスタンスメソッドを使えないか、ということを先に考えた方が良い。
また、クラスメソッドはクラス全体に関する情報を処理する場合、
インスタンスメソッドは生み出したインスタンスに関する情報を処理する場合、
に使うといったイメージだと思いました。
例えば、上の例で生成したPhone(携帯電話)の数を数えるというメソッドを作る場合、そのメソッドはそれぞれのインスタンスに関するものではなく、Phoneクラス全体に関するものなので、クラスメソッドとします。
#hogeやfugaについてちゃんと検索してみた
・メタ構文変数という名前があり他にも、foo,barなど様々ある。
・ファミリーという概念があり、foo,bar,baz等一つの塊ごとに使う。
##参考にさせて頂いた記事
##終わりに。
最後まで読んで頂きありがとうございます
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。