Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
234
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@Linda_pp

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

クラスメソッドは特異メソッドやシングルトンメソッドとも呼ばれる,インスタンスではなくクラス本体に紐付けられるメソッドです.
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 not register and get more from Qiita?
  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
234
Help us understand the problem. What are the problem?