class << Hoge の意味があんまり分かっていなかったのでメモ
先にまとめ
- クラスメソッドとは、 そのクラスへの特異メソッドの定義
- 特異メソッドは、それぞれのオブジェクトがもつ、特異クラス に定義されている
- 以下のようにするとその中はは特異クラスのスコープになる
.ruby
class << Hoge
# Hoge の特異クラスのスコープ
def fuga # Hogeに特異メソッド `fuga` を追加
end
end
クラスに特異メソッドを追加する(その1
.ruby
class Hoge
end
def Hoge.fuga
'fuga'
end
Hoge.fuga #=> "fuga"
クラスに特異メソッドを追加する(その2
class定義の中でも、得意メソッドを追加できる
.ruby
class Hoge
def self.fuga
'fuga'
end
end
Hoge.fuga #=> "fuga"
extend を使う
extend は モジュールのインスタンスメソッドを、対象の特異メソッドとして追加
なので、classの特異メソッドとして追加すれば、クラスメソッドになる
.ruby
module Fuga
def fuga
'fuga'
end
end
class Hoge
extend Fuga
end
Hoge.fuga #=> "fuga"
特異クラスに直接入れる
.ruby
class Hoge
end
class << Hoge # Hoge特異クラスへの定義
def fuga
'fuga'
end
end
Hoge.fuga #=> "fuga"
特異クラスって何?
全てのオブジェクトは自分専用のclassを内部的に持っており、それを特異クラスと呼ぶ
- オブジェクトに特異メソッドを追加する場合、そのオブジェクトの特異クラスにメソッドが追加されている
- 特異クラスには、
singleton_classでアクセスできる