クラスメソッドは特異メソッドやシングルトンメソッドとも呼ばれる,インスタンスではなくクラス本体に紐付けられるメソッドです.
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 "