jk-meets-js

恋に落ちるコード.js [技術系コメディ/短編/連載中]

This project is maintained by 8novels

恋に落ちるループ -While I’m falling in love-

「|絵子《えこ》、キャンディを10個あげよう」
「ほえ。ありがと」

 放課後、|情報処理《JS》部の部室。
 テーブルには|瀬尾絵子《せのおえこ》と|篠宮樹里《しのみやじゅり》の二人の部員。
 決してお菓子片手に無駄話をしているわけではない。立派な部活動の最中だ。

「今から絵子にキャンディを10個あげるというメソッドを実行する」
「え、なんでそこ言い直したの」
「まあまあ」

 と、樹里がおもむろに鞄の中から取り出したのは、巨大な指輪型キャンディ。それが次から次へと机の上に積み上げられていく。

「……どこで売ってたの? これ」
「では、このメソッドが終了する条件はなんだろう」
「スルーですか……そりゃ、10個あげるって言ってるから、10個もらったら終わり、だよねえ」
「その通り。では実行するから、条件式が|偽《false》になったらループから抜けるように」
「10数えたらストップって言う、ってことね。わかった」

 樹里は、絵子の目の前に指輪型キャンディを並べていく。

「いち、に、さん……」

 絵子はそれを目で追いながら、律儀に一個ずつ数える。そして……

「……ストップ。10個もらったよ。ありがと」

 というと同時に、ピンク色のキャンディを取り、包装紙を破ろうとした……絵子の手を、樹里がすばやく遮る。

「待った」
「えー」

 不服そうな表情の絵子に、樹里が問いかける。

「絵子は今、なんの根拠をもって、条件式が偽になったと思ったのだろうか」
「そりゃ、10数えてたから……」
「それだよ」

 と言うなり、樹里は部の備品であるMacBookを引き寄せ、テキストエディタに何やら入力し始めた。

var candy = 0;
for (var i = 0; i < 10; i++) {
    candy = candy + 1;
}

「今の絵子の行動をJavaScriptで表現すると、こうなる」

 と、MacBookの画面を絵子の方に向ける。

「この1行目のcandyていう変数が、実際のキャンディの数だ」
「そーね」
「で、2行目のfor文。左から初期化式、継続の条件となる式、ループが一回りするごとに実行される式を指定している」

 と、セミコロンで区切られた3つの式を、トラックパッドでなぞって反転させながら説明する。

「そーね」
「で、iってのが、さっき絵子が数えてた数字だな。いわば、絵子の心のカウンターなわけだ」
「ふむふむ」
「最初に心のカウンターをゼロにして、心のカウンターが10未満の間、心のカウンターを1ずつ増やしたわけよね」
「樹里、『心のカウンター』って言いたいだけなんじゃ」
「じゃあ、iでもいい。まずiをゼロにして」
「アイをゼロにする、ってなんか悲しくなる響きね。そこはかとなく」
「……そこは本題じゃないからとりあえず置いといて」

 樹里はMacBookを自分の方に向け直す。

「キャンディを10個数えるために、わざわざ別の、絵子の心のカウンターでも10を数えているわけだな」
「んー。深く考えてなかったけど、言われてみるとそうなるのかなあ」
「これって、人としてどうだろう」
「え。人格を疑われてんの、私。今」
「せっかくキャンディという数えやすい形状のものがあるのだ」

 樹里はキャンディの一つをつまみ上げ、光に透かすように眺める。

「それを、ダイレクトに数えればいい、と私は思うわけだよ」
「ふーむ」

 絵子も手にしたキャンディを眺めつつ頷く。

「言わんとすることは、何となくわかるよ。人としてどうか、は心外だけど」
「では、心のカウンターを使わずに、ダイレクトにキャンディを数えるように書き直すと、こうなる」

var candy = 0;
for (; candy < 10;) {
    candy = candy + 1;
}

「なんか、あんまり見たことない書き方ね」
「少なくとも、初心者向けの書籍には出てこないな。かなり変態的な書き方だと思う」
「その言い方はいろいろ波紋を呼びそうな……」

 と言いつつ、絵子はキャンディの包装を手早く破って左手薬指に装着し、樹里が止める前に口に放り込んだ。

「あーあ。まだ食べちゃダメって言ったのに……まあ書き方はともかく、余計な変数が出てくることはなくなった」
「じゃあじゃあ、最初のコードみたいにさ」

 とここまで言うと、絵子はキャンディを咥えたまま指を抜き、MacBookを自分の方に向けてカチャカチャとタイプした。

for (var candy = 0; candy < 10;) {
    candy = candy + 1;
}

「ほおは……こう書いちゃダメなの?」
「いや、こう書いても間違いじゃないし、今回のコードなら同じ結果になる。ただ、変数をループの外で宣言するのには、それなりに意味があって……ま、それについては次の機会にしよう」
「ふーん」
「で、こういう場合は、while文を使ってこう書くのが一般的だ」

var candy = 0;
while (candy < 10) {
    candy = candy + 1;
}

「whileってのは『何々してる間』って意味だな。だからこう書くと、『キャンディが10個未満の間は繰り返す』という条件がより明確になる。かなりエレガントな書き方だと思うが」
「エレガント、ねえ」 「あとは、似た構文としてdo…while文というのもある」

var candy = 0;
do {
    candy = candy + 1;
} while (candy < 10);

「この構文は、条件や初期値によらず、必ず一回はループが実行されるということだな。少なくとも一つはキャンディを渡さなければならない」
「なんでそんな悔しそうな顔なのか良くわからないけど……」

 と絵子は、机の上にあるキャンディを全部一箇所に集める。

「これって結局、ループが一回りするごとにキャンディの数をいちいち数えてるわけよね? 10個ならまあ一目でわかるけど、たとえば500個とかだったら辛くない? なんか非効率的な気もしない?」
「大丈夫。私が絵子に500個もの物品をあげることなどない」
「え」
「そもそも数を数えるのは機械だから、心配する必要などない」
「……なんだろう、このハシゴ外された感」
「まあこれは、そもそもどっちの書き方が優れてる、とか、どっちが間違ってる、とかそう言う話ではないけどな」
「あー、聞いたことあるよ。そう言う宗教論争みたいなやつ。キノコとタケノコみたいな」
「ただ、よりシンプルな記述で、より正確に意図を伝えられる表現ができる、ということはいろんな場面で役に立つ、と思う」
「小説書くときにも有効だよねー」
「そうだな。さて、他に質問は?」
「……元々、私から何か質問してた覚えはないんだけど……」

 べとべとになった左手を樹里に向け、絵子は苦笑いしながら言った。

「……とりあえず、ウェットティッシュ、ない?」