Ruby

クラスメソッドの定義方法いろいろ

More than 1 year has passed since last update.

class << Hoge の意味があんまり分かっていなかったのでメモ

先にまとめ

  • クラスメソッドとは、 そのクラスへの特異メソッドの定義
  • 特異メソッドは、それぞれのオブジェクトがもつ、特異クラス に定義されている
  • 以下のようにするとその中はは特異クラスのスコープになる
class << Hoge
  # Hoge の特異クラスのスコープ
  def fuga # Hogeに特異メソッド `fuga` を追加
  end
end

クラスに特異メソッドを追加する(その1

class Hoge
end

def Hoge.fuga
  'fuga'
end

Hoge.fuga #=> "fuga"

クラスに特異メソッドを追加する(その2

class定義の中でも、得意メソッドを追加できる

class Hoge
  def self.fuga
    'fuga'
  end
end

Hoge.fuga #=> "fuga"

extend を使う

extendモジュールのインスタンスメソッドを、対象の特異メソッドとして追加
なので、classの特異メソッドとして追加すれば、クラスメソッドになる

module Fuga
  def fuga
    'fuga'
  end
end

class Hoge
  extend Fuga
end

Hoge.fuga #=> "fuga"

特異クラスに直接入れる

class Hoge
end

class << Hoge # Hoge特異クラスへの定義 
  def fuga
    'fuga'
  end
end

Hoge.fuga #=> "fuga"

特異クラスって何?

全てのオブジェクトは自分専用のclassを内部的に持っており、それを特異クラスと呼ぶ

  • オブジェクトに特異メソッドを追加する場合、そのオブジェクトの特異クラスにメソッドが追加されている
  • 特異クラスには、 singleton_class でアクセスできる

参考