2007-09-15 [JavaScript]ラベルつきbreak文
●ループやswitch以外のブロックを脱出するbreak
JavaScriptでは、breakにラベルを指定できて、通常は多重ループを抜ける場合に用いられるような説明がなされていると思う。しかし、ラベル付のbreakは、ループやswitch以外の文を終わらせることもできる(Javaもそう)。
例えば以下のようなプログラム。
document.writeln("A");
L1: {
document.writeln("B");
L2: {
document.writeln("C");
break L1; // L1の文を終わらせるので、D、Eは実行されない
document.writeln("D");
}
document.writeln("E");
}
document.writeln("F");
【実行結果】
A
B
C
F
多重ループを一気に脱出する場合は、それなりに用途を思いつくが、ただの文ブロックを抜けるとなると、限りなくgotoを使っているような感覚を覚える。文ブロック以外に、try/catch/finallyやwith文、if/elseなどでも同様である。
あえて文ブロックをbreakで抜ける用途を強引に考えてみた。ループで配列をサーチするような場合に、対象が見つかった場合と見つからなかった場合で処理を分けたい。以下のように書いてみた。
function search(a, x) {
L1: {
for (var i = 0; i < a.length; i++) {
if (a[i] == x) {
// 見つかった場合の処理
alert('見つかった:a[' + i + '] == ' + x);
break L1;
}
}
// 見つからなかった場合の処理
alert('見つからなかった:' + x);
}
// 共通の後始末(あれば)
}
search([1, 2, 5, 6, 8], 5); // 見つかる場合の呼び出し例
search([1, 2, 5, 6, 8], 7); // 見つからない場合の呼び出し例
うわっ、これは駄目だ。こんなへたくそなプログラムは人様には見せられない・・・
まぁ、こういう場合は、returnを使うんでしょうね。ただ、上記の例にはないが、「共通の後始末」が必要な場合は、ちょっとだけ上記のような書き方をする動機づけになる。try/finallyを使えばすむ話ではあるが。
追記(2007/09/16 13:20)
「へたくそな」例は僕だったらこう書くでしょうね。
function searchIndex(a, x) {
for (var i = 0; i < a.length; i++)
if (a[i] == x)
return i;
return -1;
}
function search(a, x) {
var index = searchIndex(a, x);
if (index >= 0) {
// 見つかった場合の処理
alert('見つかった:a[' + index + '] == ' + x);
} else {
// 見つからなかった場合の処理
alert('見つからなかった:' + x);
}
// 共通の後始末(あれば)
}
search([1, 2, 5, 6, 8], 5); // 見つかる場合の呼び出し例
search([1, 2, 5, 6, 8], 7); // 見つからない場合の呼び出し例
あまり気の利いたプログラムではないと僕自身思いますが、こういう単純素朴な形なるように一生懸命考えるのが最近の好みです。そして、僕自身は多重ループからの脱出であっても、ラベルつきのbreakは使わないと思います。上記の例は、JavaScriptのトリビア的なネタということで。
自作コンパイラの部屋 > オブジェクト指向プログラム言語としてのJavaScript > ループやswitch以外のブロックを脱出するbreak
[]
「深い階層の途中まで抜ける」ってのは、たまに必要になることがあるけれど、たいていは「どこかで設計ミスしてる」ことが多い... ってのは、思考がCに毒されているからなのかね。それが「毒されてない」とするなら、<br><br>> こんなへたくそなプログラムは人様には見せられない<br><br>なんてのは、ある種必然かなと。
おごちゃん、おひさしぶり〜。見ていてくれたんですね。僕も、おごちゃんのブログは見てますよ。<br>日経mix(懐かしい)で議論していた頃ほど、こういうところへのこだわりはなくなりましたねぇ。だんだんどうでもよくなってきました(^^; とか言いながら、「こんなの人前に出せないよ〜」とか言っているやつ。
どもども^^;<br><br>最近は... つーか、MIX以後は「言語の仕様なんてどーでもいーじゃん」とか思ってプログラム書いてます。それがどれだけ建設的な議論であっても、不毛感がぬぐい去れない... ってのは、そのうち日記に書きます。<br><br>そう思いながらも、なぜかCOBOL言語委員だったりするんだよね。