Help us understand the problem. What is going on with this article?

Ruby のクラスメソッド定義まとめ

More than 5 years have passed since last update.

クラスメソッドは特異メソッドやシングルトンメソッドとも呼ばれる,インスタンスではなくクラス本体に紐付けられるメソッドです.
C++ や Java などでいう static メソッドのような感じのものです.

一番オーソドックスなやり方

class Hoge
  def self.hoge
    "hoge"
  end
end

# クラス名を直接指定して呼び出し
Hoge.hoge #=> "hoge"

# ::を使っても OK
Hoge::hoge #=> "hoge"

頭に self. を付けます.
あまり使わないですが,外からでも定義できます.

def Hoge.huga
  "huga"
end

Hoge.huga #=>"huga"

クラス定義スコープ内ではselfが定義するクラス自身を指すため,self.hogeで良かったですが,外から定義するときは直接クラス名を指定する必要があります.
また,クラスHogeは定義済みである必要があります.

複数定義する時

毎度頭にself.を付けるのが面倒な場合は

class Hoge
  class << self
    def hoge
      "hoge"
    end

    def piyo
      "piyo"
    end
  end
end

Hoge.hoge #=> "hoge"
Hoge.piyo #=> "piyo"

のように書けます.
これは1つ上のものと同様にクラス定義スコープ外でも定義できます.

class << Hoge
  def hoge
    "hoge"
  end

  def piyo
    "piyo"
  end
end

更に,Hoge がモジュールの場合は extendを使って書くことができ,

module Hoge extend self
  def hoge
    "hoge"
  end

  def piyo
    "piyo"
  end
end

Hoge.hoge #=> "hoge"
Hoge.piyo #=> "piyo"

と書けます.
class << self に比べてインデントが深くならないので,module の場合はこちらのほうがおすすめです.

外の変数を取り込んで定義

あまりないですが,外の変数を取り込んで定義したい場合はdefine_singleton_methodメソッドが使えます.

class Hoge
  a = 3
  define_singleton_method :hoge do
    a
  end
end

Hoge.hoge #=> 3

また,クラス定義スコープ外でも定義できます.

class Hoge
  # クラス定義スコープ
end

m = "hello "

Hoge.define_singleton_method :greet do |i|
  m * i
end

Hoge.greet 3 #=> "hello hello hello "

m = "goodby "
Hoge.greet 2 #=> "goodby goodby "
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away