過去の日記

2008-04-12 [長年日記]

"クラスメソッド"は実は"クラスオブジェクトの特異メソッド" [Ruby]

クラスオブジェクトはもちろん Class クラスのインスタンスという意味だろう。

Rubyソースコード完全解説

  • 作者: 青木 峰郎
  • 出版社/メーカー: インプレス
  • 発売: 2002-12
  • ASIN: 4844317210
  • メディア: 単行本
  • amazon.co.jp詳細へ

(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メソッドを使って特異メソッドを定義してやることで見た目上可能"なんだ! となったのだけど……。


真実はその逆だったのね。


追記

第10回Rails勉強会@東北 - 福島でRailsを使って仕事を頑張る計画

http://www.slideshare.net/xibbar/rubyactive-support-for-expert-2

セッションとスライドがアップされました。