232
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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 "

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
232
Help us understand the problem. What are the problem?