クラスメソッドとインスタンスメソッド
昨日の記事では、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