2008-04-12 [長年日記]
■"クラスメソッド"は実は"クラスオブジェクトの特異メソッド"
クラスオブジェクトはもちろん Class クラスのインスタンスという意味だろう。
(Ruby1.7.3 のソースの解説書なので注意)
p76
特異メソッドはどんなときに使うか。まず Java や C++ で言うスタティックメソッドのようなものを定義するときだ。つまりインスタンスを生成しなくても使えるメソッドである。こういうメソッドはRubyではクラスオブジェクトの特異メソッドとして表現されるのだ。
とある。
後の章で、
p129
Ruby ではクラスに定義された特異メソッドのことをクラスメソッドと呼ぶのだが、そのクラスメソッドにはちょっと不思議な仕様がある。クラスメソッドは、なぜか継承するのだ。
(サンプルのソース 略)
こんなことはクラス以外のオブジェクトの特異メソッドでは絶対に起こらない。つまりクラスだけが特別扱いされているのである。この説ではクラスメソッドが継承する仕組みを追っていこう。
と続く。
うーん。
意外だ。
「Rails勉強会@東北 第10回」で、クラスにモジュールをextendできるという話題から。
……いやいや。
元の話題は、モジュール使ってクラスメソッドを追加できないのか? という話で、Rails では小難しい手順でそれを実行しているのに対して、もっとシンプルに exrtend メソッドで可能だという話題。
つまり。
class Hoge end module Foo def a p "a" end end Hoge.extend Foo Hoge.a #=> "a" が出力
となること。
"クラスに対してモジュールからクラスメソッドを追加する"ことが、実は"extendメソッドを使って特異メソッドを定義してやることで見た目上可能"なんだ! となったのだけど……。
真実はその逆だったのね。
追記
http://www.slideshare.net/xibbar/rubyactive-support-for-expert-2
セッションとスライドがアップされました。