プログラミング Ruby 第2版
■ This book rocks!
プログラミングRuby 第2版 言語編 (Dave Thomas with Chad Fowler and Andy Hunt著・まつもとゆきひろ監訳/田中勝訳)。
が〜ん。と頭をハンマーで殴られたような気がする。しびれる本だ。
Ruby on Rails を読んでいて、さまざま動的なオブジェクト操作のテクニックが駆使されているのを見て、こりゃ Ruby 自体をちゃんと勉強しなくちゃいかんな、と思って買った本である。なんせ、普通に文字列操作とかやっている分には必要ないので、やれメソッドに別名をつけるだ、method_missing で他のオブジェクトにメッセージを転送するだ、なんてやったこともなければ、興味もなかったのだった。
それで、この本の文法編を第22章から読み始めた。す、すごい。この本はすごすぎる。さすが、まつもとさんいわく「質問メールを矢のように浴びせかけられ、Ruby のソースコードを読み込んで、バグを発見した挙句の果てに、それを修正してまでしてくれた」人々が書いただけの本である。
■ 特異クラス
特に第24章「クラスとオブジェクト」は非常に参考になった。特異メソッドやら特異クラスというものがなんなのか、ずーっとモヤモヤしていたのだが、p332 の図をみてようやく腑に落ちた。なるほどねえ。
a = 'abc' # a は String クラスのインスタンス
class << a
def my_length
length
end
end
というコードにおいては、my_length というメソッドが登録された無名クラスができて、これが a の特異クラスになる。そして、String クラスは、この a の特異クラスのスーパークラスなる。(ここがミソ)
(「特異」というのは、"singleton" のことらしい。このほうがわかりやすいかもね)
Rails のソースコードには、よく次のようなパタンが出てくる。
class X
class << self
def x
...
end
def y
...
end
end
end
Ruby ではクラス定義も単なる実行文なので、class X ... end の中のメソッド定義以外の場所では、self は X というクラスオブジェクト自体を指している。そのクラスオブジェクトに特異メソッドを定義しているわけだ。つまりは、次のような、より普通な書き方とほぼ同じなのでは?
class X
def self.x
...
end
def self.y
...
end
end
たぶんね。あの DHH のことだから何か特別な理由があったのかもしれない。Ruby の内部構造を知らない私には大きなことは言えません。まちがっていたら誰か教えてください。
・・・と調べていたら、
本家のRuby リファレンスマニュアル - クラス/メソッドの定義に、
# 特異メソッド方式。
class Hoge
def Hoge.foo
end
end...
# 特異クラス方式。複数のメソッドを一度に定義するとき向き
class << Hoge
def bar
'bar'
end
end
って書いてありますね。やはり、まったく同じことらしい。特異メソッドという言い方はなんだかわかりずらいな。特異クラスのメソッドが特異メソッドだということなら、別に取り立てて特異メソッドと呼ばなくてもよさそうなものだ。それ自体は普通のメソッドにすぎないわけだからね。
■ クラス名の正体
それにしても、クラス名に関する Ruby の扱いのぶっちゃけぶりに、私は度肝を抜かれてしまった。
実は、クラス名は class 文が実行されるときに登録される、単なるグローバル定数なのだ!
だから、クラス名は大文字で始まらないといけないんだね!
実際、次のようなコードを走らせてみた。
class X
def y
puts "shout!"
end
endX.new.y # 出力結果 => "shout!"
a = X
a.new.y # 出力結果 => "shout!"X = 2 # ここで定数再定義の warning が出る
puts X # 出力結果 => "2"
やれやれ、Ruby という言語がハッカーを夢中にさせる理由もわかる気がする。
このまえ XP 祭り関西でまつもとさんは LISP が Ruby の次に好きだと言っていたが、こういう動的な部分は確かによく似ているのかもしれない。LISP ではデータもプログラムもすべてリストで表現される。Ruby は LISP ほどではないかもしれないが、プログラムが自分自身を書き換える高い能力を持っているからね。
Rails を書いた DHH といい、この本の著者の Dave Thomas や Andy Hunt といい、本当に頭のいいプログラマのプロダクトは見ていて実にすがすがしい。ひょっとしたら音楽家がモーツアルトの作品を聞くときもこんな風に感じているのかもしれない。