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.

スクリプトらしい柔軟性。さすが。

そして今までこの文法を読み飛ばしてた自分のあほー