成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

クラスメソッドの定義

初歩的な事なのだけど、
改めてクラスメソッドの定義方法にいろんな書き方がある事を忘れていたのでメモ。

# 特異メソッド方式。
class Hoge
  def Hoge.foo
  end
  def self.foo2
  end
end

Rubyではクラスは定数であり、つまりオブジェクトである。
そのオブジェクトに対して、特異メソッドを定義している。
これがクラスメソッドになる。

# クラス定義の外でも良い
def Hoge.bar
end

class Foo
end
foo = Foo.new
def foo.bar
end

オブジェクトに対する特異メソッド、という意味では
上記の2つは同じ事なのだ。
ふむふむ

# 特異クラス方式
class << Hoge
  def bar
    'bar'
  end
end

class Hoge
  class << self
    def hoge
      'hoge'
    end
  end
end

特異クラスにメソッドを書いてもそれもまたクラスメソッド。
つまりクラスメソッドとは特異クラスのメソッドな分けか。
つまり、クラスメソッドと特異メソッドは同じ物なわけだ。
なるほど。


ちなみに、上記2つめの書き方は、
複数のクラスメソッドを書く場合に便利なようです。

class Hoge 
  class << self
    def hoge; end
    def foo; end
    def bar; end
  end
end