3.

(漫画のキツネと学ぶ)短時間の(そして願わくは辛くない)Rubyコース

[o]

The foxes show up.

「このために8時に起きたなんて信じられない」
「あんたが言ったんだよ」

「おまけに・・・私はまだ小切手を見せてもらってない。彼らは本が全部書けるまで払わないって言うんだ」
「僕は前金で50%もらったけど」

「なんていかさまなんだ!」
「だから言ったじゃない。あの連中には強く出ないとだめだって」

ああ、これがその2人だ。私の喘息が暴れているので、ちょっと薬の入った空気を一服してこよう。すぐに戻ってくるから。

Foxes in boxes.

「この小さな箱は何だ? 我々がいるのは、どんなひどい状況なんだ?」
「足がない」 

「うっそー!! まったく!! 私の足はどこへ行ったんだ?!」
「ああ、Photoshopのクリップボードにあるよ」

「何だって?? Photoshopがクラッシュしたらどうするんだ?」
「それがOS Xなことを祈っておくんだね」

私はこの章は布きれを持ってきた方がいいと言われた。汗をかいた時に顔を拭けるものを何か。
確かに、私たちはこの言語の全体を走り抜けることになる。できるだけ早くマッチ箱の中のマッチを全部擦るみたいに。

1. 言語と、言語で意味しているもの

Our friends, those two helpless foxies, finally realize the gravity of their predicament.

「“Rubyは読みやすいね”」
「あの・・・それ僕の台詞」

「これはある種のインフォマーシャルなのか? インフォブックやブックマーシャルか何かみたいな? 」

「僕たちのキャリアもこれで終わりだね」

私の意識では、Rubyはコンピュータ言語とは言いかねる。コンピュータ言語と言うと、それが主にコンピュータの言葉で機能することを含意するからだ。つまり、その言語がコンピュータを第一、かつ最優先のものとして遇するようデザインされているということだ。それはつまり、私たち プログラマは、外国人であり、コンピュータ地域での市民権を求めているということだ。それはコンピュータの言語なのであり、我々は世界のためにそれを翻訳してやるわけだ。

だけど、もしあなたの脳みそがその言語でものを考え始めたとしたら、それは何と呼んだらいいのだろう? その言語の単語と言葉遣いで、自分を表現するようになったとしたら? コンピュータにはそんなことはできない。だったらそれがどうしてコンピュータの言語と言えるのだろう? それは私たちの言語であり、私たちはそれを生来の言語のように使うのだ!

私たちはもはや、正直言ってそれをコンピュータ言語とは呼べない。それはプログラマ語だ。それは私たちが思考する言語なのだ。

以下の文を声に出して読み上げなさい。

5.times { print "Odelay!" }

英語の文章では、区切り記号(ピリオドとか感嘆符とか括弧とか)は声に出して読まないものだ。区切り記号は語に意味を付け加え、その文章で著者が意図していることについてヒントを与える。だから上の文をこう読むことにしよう: Five times print “Odelay!” (5 回“Odelay!”とプリントせよ。)

これはまさにこの小さなRubyプログラムがすることだ。ベックの変容したスペイン語の叫びが5回、コンピュータの画面にプリントされる。

以下の文を声に出して読み上げよ。

exit unless "restaurant".include? "aura"

ではここで基本的な真偽のチェックをしてみよう: Our program will exit unless the word restaurant includes the word aura. (語restaurantが語auraを含まない場合、プログラムは終了する。) もう一度英語で言ってみよう: Exit unless the word restaurant includes the word aura.

プログラミング言語がこんなに効果的にクエスチョンマークを使っているのを見たことがあるだろうか? Rubyは、感嘆符やクエスチョンマークのような区切り記号を、コードを読みやすくするために使っている。上のコードでは質問をしているのだから、それがはっきりわかるようにしようというわけだ。

以下の文を声に出して読み上げよ。

['toast', 'cheese', 'wine'].each { |food| print food.capitalize }

これは前の例に比べると読みにくいし、文章っぽくないけど、それでも声に出して読んでみることにしよう。Rubyはしばしば英語のように読めるけど、短縮した英語として読めることもある。上の文をすっかり英語に翻訳したら、こんな感じになる:  With the words ‘toast’, ‘cheese’, and ‘wine’: take each food and print it capitalized. (トーストとチーズとワイン、それぞれの食べ物を取って、最初の文字を大文字にしてプリントせよ。)

するとコンピュータは丁寧に Toast  と Cheese  と Wineと答える。

今の時点では、あなたはおそらくこれらの単語が実際にどう組み合わせられるものなのか疑問に思っているだろう。スモッチキスはドットや角括弧が何を意味するのか疑問に思っている。いろいろな品詞について、順に見ていくことにしよう。

ここまでであなたが理解していなければならないことは、Rubyが基本的には文章で組み立てられているということだ。それは正確には英語の文章ではないが、単語や区切り記号の短い並びにより、ひとつの考えを表わしている。これらの文章から本を作ることだってできる。ページを構成することだってできる。つなぎ合わせれば小説にだってなる。この小説は人が読むこともできるが、コンピュータにも読めるのだ。

2. 品詞

スカンクの背中の白いストライプや曲がりくねった花嫁の白いすそのように、Rubyの品詞には、たいがい見分けるための手がかりとなる視覚的なヒントがある。 区切り記号が使われていたり、最初の文字が大文字になっていたりするので、断片的なコードを見ても、あなたの頭は強く見覚えがあるように感じるだろう。あなたの心はしょっちゅう叫ぶだろう。「おや、こいつのことなら知っているぞ!」 あなたは他のルビイストたちと話をするときに、そういう「有名人」たちの名前を挙げて自慢することだってできる。

それぞれの品詞の見かけに注意するようにしてほしい。この本の残りでは詳細について詳しく述べていく。それぞれの品詞について簡単に説明するけど、別に説明が全部理解できなくとも構わない。この章の終わる頃には、Rubyプログラムのあらゆる部分が 識別できるようになっているはずだ。

変数

小文字で書かれた普通の単語はRubyの変数だ。変数は英字、数字、アンダースコアを含んでいてもよい。

x y banana2 phone_a_quail  (ウズラに電話する)は変数の例だ。

変数はニックネームのようなものだ。みんながあなたのことをスティンキー・ピートと呼んでいたときのことを覚えている? 誰かが「こっち来いよ、スティンキー・ピート!」と言う。そうするとなぜか不思議と、みんなスティンキー・ピートというのはあなたのことだと知るのだ。

変数を使って、良く使うものにニックネームをつけるのだ。たとえば、あなたが孤児院を運営していたとする。みすぼらしい孤児院だ。ダディ・ウォーバックスがもっと子供を買おうとやって来たときには、 私たちは彼に121ドル8セントを子供のテディベア代として請求する。その子が、こんな悪夢のような監禁生活の暗黒の日々の中で、テディベアに強い愛着を抱くようになっていたからだ。

teddy_bear_fee = 121.08
(テディベア代 = 121.08)

後で、キャッシュレジスタに打ち込むとき(それはRubyで動いているすごい高性能なキャッシュレジスタだ!)彼の支払いをすべて足し合わせて合計を求める必要がある。

total = orphan_fee + teddy_bear_fee + gratuity
(合計 = 孤児代 + テディベア代 + 寄付)

これらの変数のニックネームはとても助けになる。そして地下のみすぼらしい児童売買では、どんな助けだってありがたいに違いない。
 

They mock my examples.
「なあ、彼の例は変だ」
「シーッ。 121.08ドルはテディベアの値段としちゃあ悪くないよ」

 

数のうちで最も基本的なのは整数だ。これは数字の列で、プラス記号かマイナス記号をつけることができる。

1 23 -10000 が例だ。

カンマを数の中で使うことは認められていないが、アンダースコアなら使える。だから3桁ごとに区切りを入れて数を読みやすくしたかったら、アンダースコアを使うといい。

population = 12_000_000_000
(人口 = 12,000,000,000)

Rubyでは小数のことをfloatと呼んでいる。floatは小数点つきの数字か、科学的表記法で書かれた数だ。

3.14 -808.08 12.043e-04 が例だ。

文字列

文字列はいろいろな種類の文字(英字、数字、区切り記号)の並びを引用符で囲んだものだ。文字列を作るときは、一重引用符でも二重引用符でも使うことができる。

"sealab" '2021' "このマンガは愉快だ!" が例だ。

あなたが文字の並びを引用符で囲むとき、それらの文字はひとまとめにして1つの文字列として格納される。

ぶらぶらしているセレブの漏らした言葉をメモしているリポーターのことを考えてみるといい。「だいぶ賢くなったわ」とアヴリル・ラヴィーンが言っている。「今じゃビジネスがどういうものかわかっているそれは何をしなきゃいけないかってことであり、それをどうやるかってことよ」

avril_quote = "だいぶ賢くなったわ。今じゃビジネスがどう
いうものか分かっている -- それは何をしなきゃいけないかって
ことであり、それをどうやるかってことよ。" 

だから数をteddy_bear_fee変数に格納したように、今度は文字の集まり(文字列)をavril_quote変数に格納し ているわけだ。 リポーターはこの引用を印刷工に送るのだが、彼らはたまたま印刷機の操作にRubyを使っていたのだ。

 print oprah_quote #オプラの引用
 print avril_quote #アヴリルの引用
 print ashlee_simpson_debacle #アシュリー・シンプソンの惨事

 

They desire to be in my examples.
「何か大きな声で言おう! もしかしたら彼が例で使うかもしれない!」
「たとえば? “chunky bacon”とか?」

 

シンボル

シンボルは変数みたいに見える語だ。これも英字、数字、アンダースコアを含めることができるが、コロンで始めることになっている。

:a :b :ponce_de_leon (色男のレオン)が例だ。

シンボルというのは軽量な文字列だ。シンボルはふつう、文字列を使いたいが、画面に表示する必要はないという場合に使われる。

コンピュータにとってはシンボルの方が少しばかり扱いやすいのだ。胃散みたいなものだ。コロンはシンボルを消化しているときにコンピュータの胃から上がってくる泡を表している。ああ、すーっとする。

Chunky bacon!!
「Cunky bacon!!」
「Cunky bacon!!」

 

定数

定数は変数のような語だが、定数の場合大文字で始める。変数がRubyの名詞だとすると、定数は固有名詞に当たる。

Time Array Bunny_Lake_is_Missing (バニー・レークは行方不明)が例だ。

英語では、固有名詞は大文字で始めることになっている。The Empire State Building(エンパイアステートビル)みたいに。エンパイアステートビルというのは動かすことができない。エンパイアステートビルを何か別なもののことだと勝手に決めることもできない。固有名詞というのはそういうものだ。固有名詞はある特定の、通常は時間とともに変化しないものを指している。

固有名詞と同様、Rubyの定数は一度セットすると変更ができない。

EmpireStateBuilding = "ニューヨーク州ニューヨーク市5番街350"

定数の値を変えようとすると、Rubyは文句を言ってくる。そういうことには難色を示すのだ。

Come on, chunky bacon.
「ねぇ、ほんとに、chunky baconだ」
「Cunky. Bacon.」

 

メソッド

変数と定数が名詞なら、メソッドは動詞だ。メソッドは通常、変数や定数の後にドットでつなげられている。あなたはすでにメソッドが使われているのを見ている。

front_door.open

上の例で、open がメソッドだ。これは動作を表すもの、動詞だ。場合によっては、いくつかの 動作が数珠繋ぎになっていることもある。

front_door.open.close

私たちはコンピュータに玄関のドアを開けて(open)、それからすぐ閉める(close)ように指示したのだ。

front_door.is_open?

これも一種の動作だ。私たちはコンピュータにドアが開いているかどうか調べさせたのだ。このメソッドはDoor.test_to_see_if_its_open(ドア.開いているか調べよ)みたいな名前にしても良かったが、is_open?(開いてる?)のほうが短いし、ちゃんと通じる。感嘆符もクエスチョンマークもメソッド名の中で使うことができる。

 

メソッド引数

メソッドが動作を実行するためには、もっと情報が必要になるかもしれない。コンピュータにドアのペンキ塗りをさせたいなら、何色に塗るのかも教えるべきだろう。

メソッド引数はメソッドの後につけられる。引数は通常はカッコで囲んでカンマで区切る。

front_door.paint( 3, :red )

これは玄関のドアを赤色(red)のペンキで3回塗る。

メソッド引数は、メソッドから引っ張り出された追加の指定を入れた浮き輪だと思えばいい。カッコは浮き輪の濡れた丸い縁だ。カンマは引数の足で、縁から突き出している。最後の引数は足を見えないように中に入れている。

浮き輪をたくさん付けて引っ張っているボートみたいに、引数付きのメソッドは数珠繋ぎにすることができる。

front_door.paint( 3, :red ).dry( 30 ).close()

これは玄関のドアを3回赤色(red)で塗って、30分乾かし(dry)、それからドアを閉じる(close)。最後のメソッドには引数がないが、付けたければカッコを付けても構わない。空っぽの浮き輪を引っ張っていても意味はないので、通常空のカッコは省略される。

メソッドのうちのあるもの(printとか) は、カーネルメソッドだ。これらのメソッドはRuby全体で使われる。とてもよく使われるものなので、ドットは 必要ない。

print "ほら、ドットがないでしょ。"

 

クラスメソッド

上で述べたメソッド(インスタンスメソッドとも呼ばれる)と同じように、クラスメソッドも通常、変数や定数の後に付けられるが、ドットのかわりに二重のコロンが使われる。

Door::new( :oak )

ここに挙げたnew クラスメソッドは、ものを作るときによく使われるものだ。上の例では、私たちはRubyに新しいオーク材(oak)のドアを作ってくれと言っている。もちろん、Rubyはドアの作り方を知っている必要がある豊富な材木に、木こりに、あの長くてかっこいい両引き鋸 がいるのは言うまでもない。

Plenty of chunky bacon to go around.
「Chunky bacon.」
「Chunky bacon.」
「Chunky bacon.」
「Chunky bacon.」

 

グローバル変数

ドル記号で始まる変数はグローバル変数だ。

$x $1 $chunky (分厚い)や $CHunKY_bACOn (分厚いベーコン)が例だ。

変数の多くは一時的に使うためのものだ。あなたのプログラムの部分部分というのは小さな家みたいなものだ。あなたが中に入ると、その家の変数がある。ある家ではdad (お父さん)はアーチーのことで、彼はセールスマンをしていて骨格標本のコレクターだ。別な家ではdad はピーターのことで、彼はフランネルがとても好きなライオン使いだ。それぞれの家で、dad は別な意味を持っている。

グローバル変数の場合、どの小さな家でも変数が同じものを指していることが保証される。その意味ではドル記号はふさわしいものだ。アメリカの家庭はみんなドルの価値を重んじているからだ。私たちはみんなそれに夢中だ。アメリカの家のドアをノックして、キャッシュを差し出してみるといい。ドアをノックしてフランネル好きのライオン使いのピーターを差し出した場合とはリアクションが違うだろうことは請け合える。

グローバル変数はプログラムのどこででも使える。それが視界から消えることは決してない。

インスタンス変数

アットマークで始まる変数はインスタンス変数だ。

@x @y @only_the_chunkiest_cut_of_bacon_I_have_ever_seen (今まで見た中で一番分厚いベーコン)が例だ。

これらの変数は何かの属性を定義するときによく使われる。たとえば、Rubyにfront_door (玄関のドア)の幅(width)を教えたければ、front_doorの中の@width変数に値を設定すればいい。インスタンス変数はRubyの1つのオブジェクトの性質を定義するに使う。

このアットマーク属性(attribute)を意味すると考えればいい。

クラス変数

二重のアットマークで始まる変数は、クラス変数だ。

@@x@@y@@i_will_take_your_chunky_bacon_and_raise_you_two
(私は君たちのchunky baconをもらって2人のギャラを上げてやろう)が例だ。

クラス変数も、属性を定義するのに使われる。しかしRubyの1つのオブジェクトの属性を定義するかわりに、クラス変数はRubyのたくさんの関連するオブジェクトに属性を付け加える。インスタンス変数が1つのfront_door(玄関のドア)の属性を設定するのに対し、クラス変数はすべてのDoor(ドア)に対して属性を設定する。

二重のアットマークは、すべてに属性をつける(attribute all)という意味だと考えればいい。ついでに、Rubyの命令で動いている、スターウォーズのAT-ATウォーカーの群れを考えてもいい。クラス変数を変更すると、1つだけでなくすべてが変更されるのだ。

Woohoo! Chunky bacon accomplished!
「やったー! chunky baconってなんか分からないけど、とにかくやったぞ!」
「僕たち本に載るんだ!」

 

ブロック

中カッコで囲まれたコードはブロックだ。

2.times { print "ああ、私はchunky baconを例で使ったけど、2度とやらないよ!" } が例だ 。
 

ブロックを使って一組の命令をまとめてグループにし、それをプログラムの中で受け渡すことができる。中カッコは蟹のハサミみたいに見える。コードを挟んで一緒にまとめておくのだ。そういうハサミを見たときには、中のコードは1つのユニットにまとめられているというのを覚えておこう。

これはモールで売ってる、あのハローキティの箱みたいなものだ。小さな鉛筆や紙が、キラキラした透明なケースに詰め込まれており、手のひらに隠して密かな事務活動に使うことができる。もっとも、ブロックの方は見るときに、そんなに目を細める必要はないが。

中カッコのかわりにdoendを使うこともでき、ブロックが一行より長い場合には都合がいい。
 

loop do
   print "だいぶいい。" 
   print "ああ、ずっと広いし!" 
   print "あの蟹のハサミの中は背中が痛くなった。" 
 end

ブロック引数

ブロック引数はパイプ記号(|)で囲まれた変数のセットで、カンマで区切られる。

|x| |x,y| |up, down, all_around| (上、下、そこらじゅう)が例だ。

ブロック引数はブロックの先頭に置かれる。

{ |x,y| x + y }

この例では、|x,y|が引数だ。引数の後に、ちょっとしたコードがある。式 x + yは2つの引数を足し合わせる。

私はパイプ記号はトンネルを表していると思っている。これは変数が滑り降りてくる滑り台のように見える。(x は手足を広げて降りてきているが、y の方はきちっと足を閉じている。) この滑り台はブロックと、その周りの世界の間の、通路の役目を果たす。

変数は、この滑り台(あるいはトンネル)を通してブロックに渡される。

 

And then, the dismal truth.
「私には妻も子供もいない。遺産もない。世界が私のことを記憶するのは、ただchunky baconのためだけなんだ」
「痛い」 

 

範囲

範囲は、省略符号(ドットが2つか3つ並んだもの)で隔てられた2つの値をカッコでくくったものだ。

(1..3) は1から3までの数を表す範囲だ。

('a'..'z') は小文字のアルファベットを表す範囲だ。

これは持ち運ぶために畳まれたアコーディオンだと思えばいい。(確かに、あなたは自分に大きな価値があるという感覚を育むために、畳んでいないアコーディオン持って歩くこともできるが、人は時には自己不信に溺れることも必要で、アコーディオンは慎重に隠しておくのだ。) カッコは小さな手持ちアコーディオンの脇についているハンドルだ。ドットはチェーンで、ぴったり閉じられるように押さえている。

通常ドットは2つだけ使われる。3番目のドットが使われる時は、範囲の最後の値が除外される。

(0...5)は0から4までの数を表す。

3番目のドットを見たときは、アコーディオンが少しだけ開いているのをイメージするといい。音符が1つ出てこられるだけの隙間だ。この音符は最後の値だ。そしたら空にそれを食べさせてしまおう。
 

配列

配列は角カッコで囲まれたリストで、カンマで区切られている。

[1, 2, 3]は数の配列だ。

['コート', 'ミトン', 'スノーボード'] は文字列の配列だ。

これをあなたのコードにホッチキスで留められた芋虫だと思えばいい。2つの角カッコはホッチキスの針で、芋虫が動けないようにしている。だからあなたはどっちの端が頭でどっち端が尻尾か調べることができる。カンマは芋虫の足で、体の節と節の間でぴくぴく動いている。

昔々、カンマの足を持つ芋虫がいた。彼は一歩ごとに学者っぽく立ち止まるのだった。他の芋虫たちは、そのことで彼をとても尊敬しており、彼は堂々とした風采を備えるようになった。 ああ、それに彼が博愛主義者だったこと! 彼は恵まれない者たちに、新鮮な葉っぱを分け与えることで有名だった。

そう、配列はものの集まりなのだが、それだけでなく、それらの要素を特定の順序に保っているのだ。
 

ハッシュ

ハッシュは中カッコで囲まれた辞書だ。辞書というのは言葉をその定義に対応させるものだ。Rubyはこれを、等号と大なり記号で作った矢印を使ってやっている。

{'' => 'アナグマ', '' => 'イノシシ'}が例だ。

今度は、中カッコは小さな本を表している。真ん中に折れ目のある小さな開いている本(})のように見えるよね。中括弧は辞書の始めと終わりを表している。

私たちの辞書ではそれぞれのページに1つの定義があると想像してみよう。カンマはページの角を表し、次の定義を見るためにページをめくるのに使う。それぞれのページには、1つの言葉と、 矢印で示された定義がある。
 

 {
   '名前' => 'ピーター',
   '職業' => 'ライオン使い',
   'お気に入り' => 'フランネル'
 }

ハッシュを辞書にたとえたのは、定義しか格納できないからではない。上の例で私は、フランネル好きのライオン使いピーターの個人情報を格納した。ハッシュが辞書に似ているのは、検索が容易にできるからだ。

配列とは違い、ハッシュの要素は特定の順序に保たれるわけではない。

 

The foxes think silence will kill the comic.
「なんかこのコミックストリップから抜け出せないような気がしてきたよ。これって終わりのないギグなのかな?」
「ピーナッツみたいに? 」
  「黙っていれば・・・そのうち消えてくれるだろう」

 

正規表現

正規表現(regular expressionあるいはregexp)は、スラッシュで囲まれた一連の文字だ。

/ruby/ /[0-9]+/ /^\d{3}-\d{3}-\d{4}/ が例だ。

正規表現は文章の中にある単語やパターンを見つけるのに使う。式の両端にあるスラッシュはピンを表している。

ある単語をピンで両端を押さえて本の上に掲げているところを想像してほしい。あなたはその単語で本の上をなぞり、一致する語に近づくとそれは点滅し始める。一致する場所の真上で本に正規表現をピンで留めると、一致した単語の文字が輝き出す。

そしてピンを本に突き立てると、紙がくしゃみをする。reg-exp!

正規表現は、本の上を指でなぞっていくのよりずっと高速だ。Rubyは何冊もの本の検索を、正規表現を使ってとても速く行うことができる。
 

オペレータ

Rubyで算術をしたり、何かを比較したりするときには、次に挙げるオペレータを使う。リストを眺めていれば、わかるものもあるだろう。足し算 + とか、引き算 - とか、そういったものだ。

  ** !  ~  *  /  %  +  -  &  
  << >> |  ^  >  >= <  <= <=>
  || != =~ !~ && += -= == ===
  .. ... not and or          

キーワード

Rubyにはたくさんの組み込みの語があり、意味が与えられている。これらの語を変数として使ったり、自分の目的に合わせて意味を変えたりはできない。その中のいくつかは、すでに出てきている。そいつらは隠れ家の中にいるんだ。ちょっかいを出すと、公式のシンタックスエラーでもてなされることになる。

  alias   and     BEGIN   begin   break   case    class   def     defined 
  do      else    elsif   END     end     ensure  false   for     if 
  in      module  next    nil     not     or      redo    rescue  retry 
  return  self    super   then    true    undef   unless  until   when 
  while   yield 

十分だ。これらはRuby言語の有名人たちだ。このあとに続く3つの章で私たちはすごい旅に出て、これらのパーツから狡猾な(感動的)コードを組み上げる。

もう一度すべての品詞について、一通り眺めておくことをお勧めする。広い視点で見てみるのだ。次の節であなたの気質をテストすることにしよう。

Out in the pickup truck.
「この本は基本的に頭のおかしい人間が書いているって知ってた?」
「もちろん」
「ほんとのところ、彼はハイになってるよ。彼がこの狂ったようなペースで続けていくなら、すぐ燃え尽きちゃうだろうね!」 「燃え尽きるって? 彼は30になったときに、銃で頭を撃って自殺するよ!」

 

3. 私がまだあなたのことを十分子供扱いしていなかったなら

私はあなたのことを誇りに思う。私がいかにあなたのことを褒めそやしていたかと、みんなあなたに言うことだろう。スクロールしては読み、スクロールしては読んでいる、このすばらしい匿名の人物について、私はどうやって言いふらしたらいいだろう? 「この子たちは、大したやつだよ」私は彼らに言う。「まったく、この子たちにはハートがある。私は決して・・・」。そして私は感涙のあまり、最後まで言い終えることができない。

そして私の心臓は、薄い半透明な皮膚の下で明るく赤く火照り、私の気を取り戻させるために、彼らは10ccのJavaScriptを投与しなければならなくなる(私は血中の毒素には良く反応する)。まったく あれはぶっ飛ぶぜ!

あなたは良くがんばった。しかしここで私は容赦ない校長にならなければならない。私はあなたがいい点を取るのを見る必要がある。ここまでは、あなたは何もしておらず、ただ目をやたら動かしていただけだ。そう、確かに、さっきは大きな声で読み上げたね。今度は理解力が試されるんだ、スモッチキス。

以下の文で使われているそれぞれの品詞を声に出して読み上げよ。

5.times { print "Odelay!" }

あなたは自分で読んでいる間、このパラグラフを隠しておきたいと思うかもしれない。答えが目に入ってしまうかもしれないから。5があり、それにメソッド.timesが続いている。それからブロックの始めの蟹のハサミ。ドットなしのカーネルメソッドprint があり、文字列"Odelay!"が続く。最後の蟹のハサミがブロックを閉じる。

以下の文で使われているそれぞれの品詞を声に出して読み上げよ。

exit unless "restaurant".include? "aura"

print メソッド同様、exit もカーネルメソッドだ。キーワードの大きなリストのところで注意していたなら、unless もそのようなキーワードの1つであることがわかるだろう。文字列"restaurant"にはメソッドinclude?がくっついている。最後に、文字列"aura"がある。

以下の文で使われているそれぞれの品詞を声に出して読み上げよ。

['toast', 'cheese', 'wine'].
each { |food| print( food.capitalize ) }

この芋虫は高級料理を食べる。この例は配列で始まる。配列には、3つの文字列 'toast''cheese''wine'が入っている。配列にはメソッドeachが続いている。

ブロックの中は、ブロック引数foodが、小さなウォータースライドを通ってブロックの中に入ってくる。メソッドcapitalize がブロック引数の最初の文字を大文字に変え、それが変数foodとなる。大文字にされた文字列は、カーネルメソッドprintに渡される。

これらの例にもう一度目を通してほしい。使われている品詞を識別できるか確認すること。それぞれ異なる見かけをしているよね? 深呼吸して、こめかみをしっかりと押して。それでは、意味のあるコードを分析してみることにしよう。

4. あなたの成長を促すための例題

Gettin' cabin fever.
「閉所性発熱にかかっちゃったよ。弓ノコを持ってこないと」
「ああ、外に出してくれ」
「そうだ。ピックアップトラックに入れてたんだった」 「あっ! あれは私のピックアップじゃないか!」

 

以下の文で使われているそれぞれの品詞を声に出して読み上げよ。

 require 'net/http'
 Net::HTTP.start( 'www.ruby-lang.org', 80 ) do |http|
     print( http.get( '/en/LICENSE.txt' ).body )
 end

最初の行はメソッド呼び出しだ。require というメソッドが使われている。'net/http'という内容の文字列がメソッドに渡されている。この最初の行を文として考えるといい。私たちはRubyに、ヘルパコードとしてNet::HTTPライブラリをロードするように言ったのだ。

次の3行はひとまとまりになっている。定数Net::HTTPは上でロードしたライブラリを指している。そのライブラリのメソッドstart を使っている。そのメソッドに文字列'www.ruby-lang.org'と、80を渡している。

doブロックの始まりだ。ブロックには1つのブロック変数httpがある。ブロックの中では、メソッドprint が呼ばれている。何がプリントされるのか?

変数httpに対し、メソッドget が呼ばれる。getにはパスの文字列'/en/LICENSE.txt'を渡す。getにはもう1つメソッドがつながれているのに注意して。メソッドbodyだ。それからブロックがendで閉じられている。

大丈夫? 単なる興味で聞くんだけど、この例で何をやっているのかわかる? Rubyのパターンがわかるようになっていることを望みたい。そうでないなら、これらの例が頭の中に入るまで、頭を強く振って。コードは手に負える断片にまで分割することだ。

たとえば、このパターンは何度も使っている:

変数 . メソッド ( メソッド引数 )

例題のブロックの中に、このパターンがあるのがわかるだろう:

http.get( '/en/LICENSE.txt' )

私たちはRubyを使ってWebページを取得している。あなたはたぶんWebブラウザでHTTPを使ったことがあるだろう。HTTPというのはハイパーテキストトランスファープロトコルのことだ。HTTPはインターネットでWebページを転送するのに使う。インターネットをドライブしてWebページを持ち帰ってきてくれるバスの運転手をイメージするといい。彼の帽子にはHTTPという文字の縫い取りがある。

変数http はこのバス運転手だ。メソッドはこの運転手へのメッセージだ。「/en/LICENSE.txtというWebページを取って(get)きてよ」と言っているのだ。

では、このメソッドの鎖は何だろう:

http.get( '/en/LICENSE.txt' ).body

私たちはhttp バス運転手からWebページを受け取ったので、それを次のようにして頭の中に読み込むことができる。

Webページ.body

そして次のコード:

print( http.get( '/en/LICENSE.txt' ).body )

このコードは、まずWebページを受け取る。そのWebページにbody メッセージを送ると、HTMLの全体が文字列として返ってくる。その文字列をプリントする。基本的なドット-メソッドのパターンが鎖の中にどう現れているか見てほしい。次の章ではRubyの こういったパターンのすべてを探求する。これは楽しいよ。

では、上のコードがするのは何だろうか? これはRubyのホームページのHTMLを画面に表示する。Webに堪能なバス運転手を使って。

5. そして短い旅はそっとクッション停止する

Running after the truck.
「あそこだ! 追いかけろ!」
「誰が盗んだんだろう? 」
「あのクラッチにはすごくコツがいるんだ。こんなことになるはずないんだがな」 「イヤッホーッ!」
 

さて、問題がある。あなたはちょっと楽しみすぎている気がする。そしてあなたはまだ、縄跳び歌を使ってXMLの構文解析のしかたを説明している章にも来ていないのだ!

あなたがこれをすでに楽しんでいたとしたら、ものごとは余計悪くなる。この後の2つの章で、あなたは自分のRubyプログラムを書くことになる。実際、あなたに自分の ロールプレイングゲーム、自分のファイル共有ネットワーク(BitTorrent風の)、インターネットから真性の乱数を取り出すプログラムを書かせるのは、このすぐ先だ。そしてその後はあらゆるスクリプトの母、インターネットをMIDIファイルを探してスパイダリングするプログラムだ!

Proof has been extracted from the pudding.

いまやあなたもわかっているとおり(そう、知ってしまったのだ!)、これはやみつきになる。第一に、あなたは犬を散歩に連れ出すことをすっかり忘れるようになる。犬は網戸の脇に 座って、あなたの目がコードをむさぼり読み、あなたの指がコンピュータにメッセージを滑り込ませるのに合わせ、頭をきょろきょろと動かすことだろう。

あなたが構わないようになったために、いろいろなものが壊れ始める。あなたのコードのプリントアウトの山が、通気口をふさぐ。暖炉が詰まる。ごみが山積みになる。注文したテイクアウトの空箱に、処分する手間もかけられないジャンクメールの山。あなた自身の不潔さが空気を汚染する。コケが屋根にはびこり、水が詰まり、動物たちは家に入り込み、木々が土台からはい上がってくる。

しかしあなたのコンピュータは十分世話されている。そして君、スモッチキスは自分の知識でそれを育んでいる。あなたが自分のマシンと過ごす永劫の年月のうちに、あなた の一部はCPUに、マシンの一部は肉体になる。あなたの腕はポートに直接つながる。あなたの目は、DVI-24ピンコネクタから直接ビデオ入力するようになる。あなたの肺は、プロセッサのすぐ上にあって、それを冷却している。

そして雑草があなたとあなたのマシンを覆い、部屋があなたの上に落ちかかろうとするとき、あなたはスクリプトを書き終えるだろう。あなたとマシンは一緒にその最新のRubyスクリプトを、あなたが取りつかれていた製品を走らせる。そしてスクリプトはチェーンソーを起動して木を刈り取り、家を暖めるために炉にくべる。建築用微小ロボットがあなたのスクリプトから飛び出し、あなたの区画を再構築し、タイルを張り直し、改装し、クロムめっきし、磨き上げ、消毒する。強力なアンドロイドが、あなたのぼろ家をしっかりとした 建築に変える。大きな柱が立ち上がり、彫像が刻まれる。あなたはこのすばらしい地所と、取り囲む山々や、要塞の島々を支配する。

だから、あなたはたぶん大丈夫だ。で、どうしよう?  この、あなたのスクリプトに取りかかることにしない?

 ページをめくる。