クラスメソッドとインスタンスメソッド

昨日の記事では、RSS Lib を使ってみるところまで実行しました。今日はその中で早速気になった部分から見ていきたいと思います。
まず気になったのが下記の部分です。

rss = RSS::Parser.parse(rss_cont, false)

インスタンスを作成する前から(new する前から)、parse メソッドを呼び出しています。インスタンスが無いのに操作できてしまうというのは、どういうことなんでしょうか?
調べてみると RSS::Parser.parse というのは、module RSS の Parser Class にある parse メソッドであることが分かります。場所は lib/rss/parser.rb にあります(以下抜粋)。

  class Parser
  	~省略~
    class << self
  	  ~省略~
      def parse(rss, do_validate=true, ignore_unknown_element=true,
                parser_class=default_parser)
        parser = new(rss, parser_class)
        parser.do_validate = do_validate
        parser.ignore_unknown_element = ignore_unknown_element
        parser.parse
      end
    end
  	~省略~
  end

"class << self" というのが謎です。ググって見ると ruby では "class << インスタンス ... end" で特異メソッドを定義できるそうです。特異メソッドというのはそのインスタンス特有のメソッドという意味となります。ということは上記で行われていることは class Parser の中における self であるため、Parser クラスというオブジェクトを指しています。これは Parser クラスのインスタンスではないことが注意点です。Ruby ではクラス自身もオブジェクトであるというところが、ここで言いたいこととなります。この辺りは言葉では説明が難しいところですが、要するにクラスメソッドを定義しているということになります。そのため Parser.parse という呼び出し方をしていたようです(Parser と書くと Parser クラスオブジェクトを意味する)。
上記より Parser クラスのインスタンスを作成する前でも、クラスメソッドであるため呼び出すことが可能となる。試しに以下のコードを書いて試してみた。

#!ruby

class Hoge
  def printHoge1
    print "Hoge1\n"
  end
  class << self
    def printHoge2
      print "Hoge2\n"
    end
  end
end

begin
  Hoge::printHoge1
rescue => exc
  print "in rescue\n"
  print exc
  print "\n"
end

Hoge::printHoge2

クラスメソッドとインスタンスメソッドを定義。インスタンスメソッドは当然 new してからでないと呼び出せないはずで、クラスメソッドは"クラス名::メソッド名"で呼び出すことが可能。
結果は下記の通り。

in rescue
undefined method `printHoge1' for Hoge:Class
Hoge2