![]() |
彼は自らの手になる釣鐘型の船に乗り、時空を旅している。自己を見出すために。真実を見出すために。 その男の名は、ドクター・N・ハロルド・チャム |
はっきり言って、ドクター・チャムが狂人だという話を聞くのにはうんざりしている。確かに彼は自分で生き埋めになろうとした。確かに彼は姪を感電死させた。確かに、 そう、彼は養老院を爆破した。しかしそれにはすべてしかるべき理由があったのだ。私は彼が正しい選択をしたのだと信じている。
あなたは世間の人と同じ考えだろうと思うが、もし彼にRubyのクラス定義のすべてについて教わる機会があったなら、彼に対してちょっと尊敬の念を抱くようになるだろう。ミックスインについて学んだならなおのことだ。そしておそらくこの章 が終わる頃には、私たちは皆、ドクターの痛ましい過去にとらわれずに彼を見ることができるようになり、もう狂人と呼ぶのはやめるだろう。
もしそれでも彼を狂人と呼ぶ必要があるというなら、私なら線路まで下りて行ってどこかの長い蛍光灯を砕く。すぐ憂さを晴らすといい。私たちが取りかかる前に。
1. これは権利を奪われた人のため
![]() |
||
「私の祖母がいた療養施設は1940年代に ドクター・チャムに吹き飛ばされたんだ。なんて惨劇だろう」 |
「みんなあいつをグラニーボマーと呼んでたよ。まったく恐ろしい男だ。あいつが私たちを爆破しやしないかと思うと、今でも死ぬほど恐ろしい」 |
「だけど今度はこっちだって準備してるよ。うちの療養施設にはちょっとした防衛予算があるんだ。毎日午後4時の塹壕掘りだって手伝ってる! それに私たちにゃハーコート将軍っ人がついてるんだ! |
ドクター・チャムの人生の中の年を1つあげてもらえたら、その時期における彼の概要を教えてあげるよ。私はそれをRubyのメソッドを使ってやる。これは独立した一片の孤立したコードの塊で、ロボット火山の声にだってつなぐことができる。そんななものが権威ある声優に最高の仕事になるときには。
OK、ここではdef
とcase
とwhen
に注意してもらう必要がある。範囲は3章で見ているよね。1895..1913
という閉じたアコーディオンだ。これは両方の端とその間の値を含んでいる。それから行の終わりのバックスラッシュは行末のEnterキーを無視し、この行にはまだ続きがあるのだととRubyに請け合っている。
ではdef
とcase
とwhen
に気をつけて。
def dr_chams_timeline( year )
case year
when 1894
"生まれる。"
when 1895..1913
"ミシシッピ州ウィンストン郡のルースビルで子供時代を過ごす。"
when 1914..1919
"ペカンの園芸店で働く。クエーカー教徒を殴る。"
when 1920..1928
"ミシシッピ川を旅しながら考え深い自己改革に従事するウィズダミン川協会に入る。その\
ウニバーシティにおいて140単位を修了する。"
when 1929
"時間旅行するキジ狩人の小説を書くため、ルースビルに戻る。"
when 1930..1933
"ペカン園芸の保険の仕事で相当なキャリアを積む。経済的に安定し、ブラジルとニューメ\
キシコで過ごし、珍しい薄い殻のペカンの木を買い占める。彼の名声は高まるばかりだっ\
た。それから、なんと彼は自分を生き埋めにする。"
when 1934
"小説執筆に戻る。狩人を保険業界の大物に、キジをクエーカー教徒に変える。"
when 1935..1940
"ウィズダミン川協会会長のアーサー・コーンを客として家に招く。5年間一緒に工学と投資\
を行う。"
when 1941
"ことが面白くなるのはここからだ。"
end
end
まずdef
キーワード。これは私たちがする最初のメソッド定義だ。def
はただのカーネルメソッドで、Rubyのどこでも使うことができる。さて、これはどうやって実行すればいいのか?
puts dr_chams_timeline( 1941 )
これは"ことが面白くなるのはここからだ。"
という答えを返す。毎回同じ話だ。退屈なら自分の答えを使うといい。上ではcase
の答えが必ず文字列になるようにしている。そしてcase
文はメソッドの最後の(そして唯一の)文になっているので、メソッドはその文字列を返すことになる。流れる水は、岩棚から岩棚へとこぼれ落ちる。
case
文について説明しよう。実際私はこれをcase..when
文と呼ぶべきだろう。case
とwhen
を別々に使うことはできないからだ。case
キーワードには値がくっついていて、それがwhen
キーワードのそれぞれにくっついている値と比較される。最初にマッチした値がcaseに使われ、残りは無視される。同じことをたくさんのif..elsif
を使ってやることもできるが、そうすると長くなる。
case year
when 1894
"生まれる。"
when 1895..1913
"ミシシッピ州ウィンストン郡のルースビルで子供時代を過ごす。"
else
"この年については記録がない。"
end
これは次のように書いても同じだ。
if 1894 === year
"生まれる。"
elsif 1895..1913 === year
"ミシシッピ州ウィンストン郡のルースビルで子供時代を過ごす。"
else
"この年については記録がない。"
end
三重の等号は長く伸びたベルベットのロープで、二重の等号と同様に値をチェックしている。ただ三重の等号の方がロープが長く、真ん中の辺でたるんでいる。あまりきっちりとはしておらず、少しばかり柔軟性がある。
上の例の範囲を見てみよう。(1895..1913)
というのは1905
と全然等しくはない。範囲(1895..1913)
が本当に等しくなる相手は範囲(1895..1913)
だけだ。三重の等号は、範囲に対しては隙間を作って整数1905
を入れてくれる。この整数は範囲と等しくはないが、範囲が表す整数の集合に含まれている。場合によってはそれで十分なこともあり、たとえば上で作った年表がそうだ。
これは実際年表のように見えるよね? もちろんdr_chams_timeline
メソッドはコードなわけだけど、年表みたいに読むことができ、すっきりしていて愛らしい。
![]() |
||
ドクター・チャムに虐殺された高齢者の中に私の祖母のスーザン・レイ・マッグウィンもいました。私はそれ以来入念な調査をし、私の祖母が死に値する憎むべき女性であったことを知るにいたりました。 |
私のノートには、祖母の姿を変えるものへの悪魔崇拝、潜水艦のハイジャック、骸骨の誘惑、子どもたちの上に基礎を作って家を建てること・・・まったく病的なことが次から次へと並んでいます。 |
私はドクター・チャムが彼らを殺してくれたことに本当に感謝しています。あのホームでは巨大なロボットアライグマを建造していたのです。アライグマは人に噛みつくんです! |
しかし彼は病気だったのか??
彼はタイミングが悪かったのだ。小説家としては散々だったが、錬金術への挑戦は見込みがあるように見えた。彼はヤギの乳と海塩から脚の痛みを取る万能薬 を作った。ある男はなくした指が1インチ伸びてきたほどだった。足のような臭いがするが暗闇でも目が見えるようになる有機健康煙を作った。水梯子と呼ばれるものにも取り組んでいたが、私は現物を見たことがないし、それについて書かれたものも読んだことがない。登るためのものではありえないだろう。わからないけど。
地元の新聞社が実際ドクター・チャムの元を訪れたことがある。彼らの書評家が彼に4つ星の評価をしたのだ。本当に。その書評家は彼についての記事を書き、そして彼を評価したのだ。
ドクター・N・ハロルド・チャムが姪のことですごく辛く感じていたことは知っておいてほしい。彼はそのショック療法は効果があると思ったのだ。どのみち彼女はポリオのために死んでいたはずだ。彼はチャンスに賭けたのだ。
1941年9月9日、彼は自分の私有する手術室で、ハンナをフェナセチンで鎮静させた後、鼻と舌とつま先と肘に伝導クリップをつけた。弟子であるマービン・ホリオークという名のそばかすの大学生に手伝わせ、彼 が最高傑作(opus magnum)と呼ぶ物質の粉をハンナに振りまいた。粉末のホワイトゴールドが流れを運び、彼女にエネルギーを与え、血を活性化 させ、戦い、打ち破れるようにするのだ。
しかしそれがどんなに失敗したことか。スイッチが入れられたとき、彼女はエビ反りになって足をばたつかせ——カブラム!——それからブロイ オイ オイ クポイ!と叫んだ。彼女の巻き毛に光の壁、そして死の鐘が鳴った。実験は立ち上がるものすごい煙とともに失敗し、彼女の無邪気さは部屋の床と彼らの胸に大きな穴をあけた(何週間も、みんな「あの子にはチャンスがなかったんだ・・・」と口にしていた)。
ハンナのために、私はコードを書こう。
opus_magnum = true # 最高傑作 = true
def save_hannah # ハンナを救う
success = opus_magnum
end
メソッドは自分の島を持っている。そしてメソッドの中で起こることは、まわりにあるただの変数には影響を受けない。ドクター・チャムは姪の病気を打ち破ることができなかった。それはopus_magnum
変数がメソッドの鋼鉄の外壁に入り込むことができないようなものだった。
save_hannah
メソッドを実行すると、Rubyはopus_magnum
が見あたらないと文句を言うだろう。
私はスコープについて話している。顕微鏡(マイクロスコープ)は視野を狭めて拡大する。望遠鏡(テレスコープ)は視野の範囲を押し広げる。Rubyではスコープはメソッドやブロックの中の視野を表している。
メソッドのdef
ステートメントは視野を開く。そこで導入される変数名はメソッドの中では見ることができ、意味を持ち続けるが、end
で目が閉じられる。メソッドに引数でデータを渡
したり、メソッドからデータを返すことはできるが、メソッドの中で使われている名前はそのスコープ内でしか効果を持たない。
ある種の変数はより広いスコープを持っている。お金の記号で始まる$LOAD_PATH
のようなグローバル変数は、どのスコープでも使うことができる。アットマークで始まる@names
のようなインスタンス変数は、クラススコープの中でならどこでも使える。同じことは@@tickets
のようなクラス変数についても言える。クラス変数とインスタンス変数についてはもう少しあとで説明する。
ブロックもスコープを持つが、すこし曖昧で、もっと柔軟性がある。
verb = '救った'
['鎮静剤を与えた', '振りかけた', '感電死させた'].
each do |verb|
puts "ドクター・チャムは姪のハンナに" + verb
end
puts "そう、ドクター・チャムは姪のハンナを" + verb
ブロックはドクターのそれぞれの行動をイテレート(循環)する。verb
変数はそれぞれの回ごとに値が変わる。ある回では鎮静剤を与えている。その次では粉を振りかけている。それから感電死させる。
疑問は、ブロックが終わったらどうなるのかということだ。ドクターはハンナを救えたのだろうか?
ドクター・チャムは姪のハンナに鎮静剤を与えた ドクター・チャムは姪のハンナに振りかけた ドクター・チャムは姪のハンナに感電死させた そう、ドクター・チャムは姪のハンナを感電死させた
ブロックは周辺にある変数を見ることができる。ブロックはverb
変数が存在することに気付き、その内容を書き換えたのだ。ブロックが終了すると、ブロックの短い命は終わるが、verb
変数は別な生き物として現れる。
ブロックが前に使われていない変数を使う場合には、変数はブロックの終わりとともに消滅する。ブロックのスコープは閉じられ、変数はそれとともに消えてしまう。verb
がブロックの前では使われてなかったとしよう。
['鎮静剤を与えた', '振りかけた', '感電死させた'].
each do |verb|
puts "ドクター・チャムは姪のハンナに" + verb
end
puts "そう、ドクター・チャムは姪のハンナを" + verb
これはundefined local variable or method `verb'
('verb'は未定義のローカル変数ないしはメソッドです)というエラーになる。
まだ糊のきいた刺繍のあるドレスを着ているが、口の隅が暗い紫色になった少女の死体を運び出すというのは、優れた科学者にとっても難しいことだったのに違いない。ドクター・チャムの日記には、 輝く金と焦げたレースを身にまとったハンナの幽霊に苛まれたことが書かれている。妄想は次第に大きくなり、彼は地獄の犬と、復讐に燃える天使の大きな手に追いかけられた。
何週間もたたぬうちに、彼は去った。この悔恨から逃れ、この惑星から彼を飛び立たせる爆発とともに消えた。
そしてあなたが今これを読んでいるにしても、この瞬間にどこかで、孤独なドクター・チャムは釣鐘型の乗り物に乗り、60年の旅の後に遠く離れた惑星に降り立っている。新しい世界が視野に入り、近づくにつれ惑星の地平が広がり、 釣鐘が怒る天を駆け抜け、オーロラと太陽風を引き裂くのとともに、ドクター・チャムの目は揺り覚まされる。
![]() |
||
|
|
美しい |
あなたが目撃しているのは、ドクター・チャムの惑星エンダートロムへの着陸だ。私にわかる限りで言うと、彼はこの惑星でほとんど何も起こらない荒涼とした季節に降り立った。ほとんどの住人は心をぼんやりしたざわめきの中に閉じこめ、一部の知恵と三部の靄からなる退屈な幽霊へと分解し ていた。
エンダートロムの歴史と天候についての私の知識は、私の娘のオルガン教師との付き合いから得たものだ。彼はこの惑星で育ったのだ。
![]() |
||
「お年寄りの人たちの中にはドクター・チャムがまだ宇宙を飛び回っていると思っている人もいます。なんてたわごとかしら!」 |
「もし悪いグラニーボマーが宇宙にいるのなら、私の夫のチャールズ——1997年に亡くなりました——彼の魂の安らかならんことを——彼が今では宇宙にいて、レーザーをぶちかまし、彗星の尻尾に乗っている わ」 |
「ドクターがチャーリーに勝てる見込みはないわね。チャーリーが彼にとどめを刺すでしょう・・・ドクターがチャーリーの欲しがるテクノロジーを持っていれば別だけど。その場合はチャーリーはドクターと同盟を組んで、爆破事件がもっと起きることになるわね」 |
私の娘のオルガン教師は、ちゃんと約束を守るように繰り返し言ってやる必要があった。彼は変な時間に訪問することがあり、緊急の電話にも即座に出た。彼が最後に明かしたのは、彼がエイリアンで、起きている時間が540時間続くということだった。私は彼にすごく元気づけられ、2060年まで続くことになる契約関係を彼と結んだ。
ドクター・チャムは(彼の懐中時計で)3日間暗い空気の柱の中を旅し、不毛な惑星のほこりっぽい風を吸った。しかし3日目に、荒涼とした季節が終わり、野生のリンゴの花と、霞んだ城に飾られた見事な光景が拡がるのを、彼は目の当たりにした。