class << selfを調べてたら特異メソッドとか特異クラスとか出てきた
普段マジメにソース読みをしないせいで自分の書き方以外のコードが読めない読めない。もっとマジメにコード読もうと思う。
てなわけで今日はclass << selfってなんだよって思ってた。結論はクラスメソッドを複数作成したいときに便利な構文。
で、"class << hoge"というイディオムを調べてたら「特異クラス」の一種だとか。ああ、特異クラスという言葉は聞いた事あった。特異メソッドというのもあったね。
ということでRubyリファレンスから勉強。
6.4 特異メソッドとは何ですか
foo = Foo.new def foo.hello print "Hello\n" end foo.hello
つまりクラスを拡張することなくオブジェクトにメソッドを追加しちゃうわけっすね。
じゃあ、特異クラスって?
6.6 特異クラスとは何ですか
class Foo def hello print "hello.\n" end end foo = Foo.new foo.hello #=> hello. class << foo attr :name, true def hello print "hello. I'm ", @name, ".\n" end end foo.name = "Tom" foo.hello #=> hello. I'm Tom.
うひゃー。すごい。foo.helloの挙動が変わっちゃった。その代わりnameに代入しないと"hello. I'm nil."なんて出ちゃうけど。(いや、そういう風に実装されてるんだけどね)
だから、
class Hoge class << self def yeah print "yeah.\n" end def hey pring "hey.\n" end end end
って書いておくとさっきはfooというオブジェクトに対してfoo.helloという特異メソッドがクラスに追加されてたのが、selfに追加されるからself.yeahとかself.heyというメソッドが追加されるから結果的にクラスメソッドになると。
ちゃんと実行もでけた。
Hoge.yeah #=> yeah. Hoge.hey #=> hey.
スクリプトらしい柔軟性。さすが。
そして今までこの文法を読み飛ばしてた自分のあほー