スカンクの背中の白いストライプや曲がりくねった花嫁の白いすそのように、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
(合計 = 孤児代 + テディベア代 + 寄付)
これらの変数のニックネームはとても助けになる。そして地下のみすぼらしい児童売買では、どんな助けだってありがたいに違いない。
 |
「なあ、彼の例は変だ」
「シーッ。 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 #アシュリー・シンプソンの惨事
 |
「何か大きな声で言おう! もしかしたら彼が例で使うかもしれない!」
「たとえば? “chunky bacon”とか?」 |
シンボル
シンボルは変数みたいに見える語だ。これも英字、数字、アンダースコアを含めることができるが、コロンで始めることになっている。
:a
や :b
や :ponce_de_leon
(色男のレオン)が例だ。
シンボルというのは軽量な文字列だ。シンボルはふつう、文字列を使いたいが、画面に表示する必要はないという場合に使われる。
コンピュータにとってはシンボルの方が少しばかり扱いやすいのだ。胃散みたいなものだ。コロンはシンボルを消化しているときにコンピュータの胃から上がってくる泡を表している。ああ、すーっとする。
 |
「Cunky bacon!!」
「Cunky bacon!!」 |
定数
定数は変数のような語だが、定数の場合大文字で始める。変数がRubyの名詞だとすると、定数は固有名詞に当たる。
Time
や Array
や Bunny_Lake_is_Missing
(バニー・レークは行方不明)が例だ。
英語では、固有名詞は大文字で始めることになっている。The Empire State
Building(エンパイアステートビル)みたいに。エンパイアステートビルというのは動かすことができない。エンパイアステートビルを何か別なもののことだと勝手に決めることもできない。固有名詞というのはそういうものだ。固有名詞はある特定の、通常は時間とともに変化しないものを指している。
固有名詞と同様、Rubyの定数は一度セットすると変更ができない。
EmpireStateBuilding = "ニューヨーク州ニューヨーク市5番街350"
定数の値を変えようとすると、Rubyは文句を言ってくる。そういうことには難色を示すのだ。
 |
「ねぇ、ほんとに、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はドアの作り方を知っている必要がある—豊富な材木に、木こりに、あの長くてかっこいい両引き鋸
がいるのは言うまでもない。
 |
「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つだけでなくすべてが変更されるのだ。
 |
「やったー! chunky baconってなんか分からないけど、とにかくやったぞ!」
「僕たち本に載るんだ!」 |
ブロック
中カッコで囲まれたコードはブロックだ。
2.times { print "ああ、私はchunky
baconを例で使ったけど、2度とやらないよ!" }
が例だ 。
ブロックを使って一組の命令をまとめてグループにし、それをプログラムの中で受け渡すことができる。中カッコは蟹のハサミみたいに見える。コードを挟んで一緒にまとめておくのだ。そういうハサミを見たときには、中のコードは1つのユニットにまとめられているというのを覚えておこう。
これはモールで売ってる、あのハローキティの箱みたいなものだ。小さな鉛筆や紙が、キラキラした透明なケースに詰め込まれており、手のひらに隠して密かな事務活動に使うことができる。もっとも、ブロックの方は見るときに、そんなに目を細める必要はないが。
中カッコのかわりにdoとendを使うこともでき、ブロックが一行より長い場合には都合がいい。
loop do
print "だいぶいい。"
print "ああ、ずっと広いし!"
print "あの蟹のハサミの中は背中が痛くなった。"
end
ブロック引数
ブロック引数はパイプ記号(|)で囲まれた変数のセットで、カンマで区切られる。
|x|
や |x,y|
や |up, down, all_around|
(上、下、そこらじゅう)が例だ。
ブロック引数はブロックの先頭に置かれる。
{ |x,y| x +
y }
この例では、|x,y|
が引数だ。引数の後に、ちょっとしたコードがある。式 x + y
は2つの引数を足し合わせる。
私はパイプ記号はトンネルを表していると思っている。これは変数が滑り降りてくる滑り台のように見える。(x は手足を広げて降りてきているが、y
の方はきちっと足を閉じている。) この滑り台はブロックと、その周りの世界の間の、通路の役目を果たす。
変数は、この滑り台(あるいはトンネル)を通してブロックに渡される。
 |
「私には妻も子供もいない。遺産もない。世界が私のことを記憶するのは、ただ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つの言葉と、
矢印で示された定義がある。
{
'名前' => 'ピーター',
'職業' => 'ライオン使い',
'お気に入り' => 'フランネル'
}
ハッシュを辞書にたとえたのは、定義しか格納できないからではない。上の例で私は、フランネル好きのライオン使いピーターの個人情報を格納した。ハッシュが辞書に似ているのは、検索が容易にできるからだ。
配列とは違い、ハッシュの要素は特定の順序に保たれるわけではない。
 |
「なんかこのコミックストリップから抜け出せないような気がしてきたよ。これって終わりのないギグなのかな?」
「ピーナッツみたいに? 」 |
|
「黙っていれば・・・そのうち消えてくれるだろう」 |
正規表現
正規表現(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つの章で私たちはすごい旅に出て、これらのパーツから狡猾な(感動的)コードを組み上げる。
もう一度すべての品詞について、一通り眺めておくことをお勧めする。広い視点で見てみるのだ。次の節であなたの気質をテストすることにしよう。
 |
「この本は基本的に頭のおかしい人間が書いているって知ってた?」
「もちろん」 |
「ほんとのところ、彼はハイになってるよ。彼がこの狂ったようなペースで続けていくなら、すぐ燃え尽きちゃうだろうね!」 |
「燃え尽きるって? 彼は30になったときに、銃で頭を撃って自殺するよ!」 |