どうやら僕は,何かを考えるとき,意味もなく歩き回る癖があるようだ。すっかり冬の空気になってしまった街をあてもなく歩きながら,彼女のことを考えていた。

 暗号メールによって,彼女から一方的に別れを宣告されてから,かなりの時間が経過してしまった。僕は,もどかしさを抱えたまま,大学以来の友人Kに再び電話をした。

K :「彼女から連絡はあったのかい?」
僕:「いや,何もない」
K:「君からメールは?」
僕:「何度か送っている。でも暗号メールが一度返ってきただけだよ」
K:「そうか。ところで彼女はなぜ,暗号メールを送ってくるんだ?」
僕:「わからないよ。きっと彼女なりの事情があるのかもしれない」
K:「クジラの夫婦が老後の相談をするように?」
僕:「ねぇ,僕は本当に困っている」
K:「もう一度メールを送るかい。暗号を使って」
僕:「暗号で?」

 暗号でメールを送る。友人Kから言われるまで考えもしなかった。暗号メールを送るというのは,少しだけすてきなことに思えた。無意味に終わるかもしれないが,彼女からメールが来ない今の僕には,いずれにしろこちらからメールを送るしかないのだ。友人Kは一言「いい暗号を期待してるよ」と添えて電話を切った。

 普段から遊び心がない僕には,なかなかすてきな暗号メールが思い浮かばない。そこで,メールを考える前に,Rubyについて思いをめぐらせながら,何かよい暗号が思い付くことを祈ろう。

誰もが自由にクラスの定義を変更できる

リスト1●Stringクラスにhogeメソッドを定義したプログラム
リスト1●Stringクラスにhogeメソッドを定義したプログラム

 ふと思い付いたのが,Rubyの強力な機能である「オープンクラス」だ。オープンクラスとは,誰もが自由にクラスの定義を変更できる機能のことだ。これでは何を言っているのかわからないだろう。リスト1のコードを順に見ていこう。

 まず(1)で文字列をsという変数に格納している。(2)では,変数sに対して,hogeメソッドを呼び出そうとしている。もちろん,Stringクラスに「hoge」なんていう名前のメソッドは存在しない。そのためエラーになる(リスト1は,このエラーで行き詰まり,実行できない。わかりやすさを優先したので例外処理は省いている)。

 ところが,(3)でStringクラスを再定義して,hogeクラスを追加してみる。そして,もう一度hogeメソッドを呼び出してみると,今度はきちんと呼べるのだ。

 これがオープンクラスの機能であり,この例ではStringクラスの定義を変更している。

 よくよく考えてみると,これはとてもすごい機能ではないだろうか!

 Stringクラスは,Rubyが標準で提供している組み込みのクラスだ。標準で提供しているクラスまで,こちらの自由に変更できるようになっているのだ。以前に話したように,Rubyは「なんでもオブジェクト」だ。だから,すべての値はなんらかのクラスに属していることになる。そのクラスを変更できるということは,すべての振る舞いを自由に変更できてしまうということだ。

 リスト1の例はメソッドの新規追加だが,もちろん既存のメソッドを上書きすることも,そして削除することも可能だ。メソッドが削除できるということは,プログラマにとって驚きの機能だが,この機能を使うことはほとんどないので,これ以上の説明は割愛させてほしい。

 ここでは,利用する機会の多い「メソッドの上書き」機能の例を見てみよう。リスト2は,Stringクラスのsizeメソッドを書き換えて,常に「0」を返すようにしたコードだ。sizeメソッドは本来,文字数を取得するメソッドになる。

s = "EVA"

puts s.size   #-> 3

class String
  def size
    0
  end
end

puts s.size   #-> 0
リスト2●Rubyでは標準で提供されているメソッドも変更が可能

 リスト2の処理内容には,特に意味はない。しかし,自らコードを書いて実行してみることで,既存のメソッドが再定義されて,挙動が変わっていることを実感できるだろう。