塩焼きブログ

塩焼きに関しての研究内容を公開しています

Rubyのクラスメソッドを自作する

class << ClassNameでクラス自身をレシーバとしたクラスメソッドを作成することができる。 例はクラス定義の中でクラスメソッドを追加している。クラスメソッドがselfで呼ぶものは同様のクラスメソッドとなる。

class Message

  class << self

    def hello_puts(name)
      puts self.hello_message(name)
    end

    def hello_message(name)
      "Hello #{name}"
    end

  end

end
Message.hello_puts("Jane")
# Hello Jane

def ClassName.methodとしてクラスメソッドを定義することもできる。例は先の例と同様の機能を持つクラスメソッドである。

class Message

  def self.hello_puts(name)
    puts self.hello_message(name)
  end

  def self.hello_message(name)
    "Hello #{name}"
  end

end

Message.hello_puts("Jane")
# Hello Jane

このインスタンスメソッドとクラスメソッドの実用例としてRuby on Railsがある。 Ruby on Railsのモデルでは、インスタンスメソッドはテーブルのレコードのデータを参照する事ができ、クラスメソッドはModel.findModel.whereでデータ全体にアクセスする事ができる。 したがって、レコードに登録されたユーザー名を出力時に加工したい時、ビューに直接処理を書かずにモデル内に処理を内包したい時はインスタンスメソッドで定義する。また、最近更新されたレコードを取り出すといった処理をコントローラーに毎度記述せずにモデル内に内包したい時はクラスメソッドとして定義する。