スクリプトは上から下へ byティラノ
プログラムでもスクリプトでも、
基本的には上から下に書いたとおりに実行されていきます。
って言うのはわかっていても、なぜか予想通りの結果にならない!
そんな時には自分が書いた記述を振り返ってみましょう。
ティラノスクリプトの記述で例を出しますが、
Javascriptととかでも一緒な気がします。
if文で書いてみよう
ifは評価が正しければ実行して、そのまま次へ行く。
なので、なんにも考えずに使っていると、思わぬ挙動になるときがあります。
下の例だと、実行する度に、1だよ、2だよ、……と、順番にでます。
[eval exp="f.flag = 1"] [if exp="f.flag == 4"] [cm] 4だよ[l][r] [cm] [eval exp="f.flag = 0"] [endif] [if exp="f.flag == 3"] [cm] 3だよ[l][r] [cm] [eval exp="f.flag = 4"] [if exp="f.flag == 2"] [cm] 2だよ[l][r] [cm] [eval exp="f.flag = 3"] [if exp="f.flag == 1"] [cm] 1だよ[l][r] [cm] [eval exp="f.flag = 2"]
ちなみに、[if exp="f.flag == 4"]が一番上になっていますが、この順番じゃないとうまくいきません。
私は[if exp="f.flag == 1"]から並べて、一回の実行で全部の文字が出てしまう、
悲しいミスをしました。下の例みたいな感じです。
一回の実行で1だよ、2だよが連続して表示されます。
[eval exp="f.flag = 1"] [if exp="f.flag == 1"] [cm] 1だよ[l][r] [cm] [eval exp="f.flag = 2"] [endif] ;既にf.flagは2なので、下も表示されてしまう。 [if exp="f.flag == 2"] [cm] 2だよ[l][r] [cm] [eval exp="f.flag = 3"]
elseを使えば、順番を考えなくても似たような結果が得られます。
elseで書くとこうなる!
elseは上から評価して、最初に正しかった物だけ実行する。
下の例だと、実行する度に、1だよ、2だよ、……と、順番にでます。
[eval exp="f.flag = 1"] [if exp="f.flag == 1"] [cm] 1だよ[l][r] [cm] [eval exp="f.flag = 2"] [elsif exp="f.flag == 2"] [cm] 2だよ[l][r] [cm] [eval exp="f.flag = 3"] [elsif exp="f.flag == 3"] [cm] 3だよ[l][r] [cm] [eval exp="f.flag = 4"] [elsif exp="f.flag == 4"] [cm] 4だよ[l][r] [cm] [eval exp="f.flag = 0"] [else] [cm] 0になったよ![l][r] [cm] [endif]
ちなみに、
下の例だと、1だよ、2だよの後は、2だよが実行され続けます。
[eval exp="f.flag = 1"] [if exp="f.flag == 1"] [cm] 1だよ[l][r] [cm] [eval exp="f.flag = 2"] [elsif exp="f.flag == 2"] [cm] 2だよ[l][r] [cm] [eval exp="f.flag = 2"] [elsif exp="f.flag == 2"] [cm] 2だけど、永遠にここへはこないよ![l][r] だからf.flagは3になることがないよ![l][r] [cm] [eval exp="f.flag = 3"] [else] [cm] ここにもこないよ![l][r] [cm] [endif]
話は変わるがswitch文
まだティラノスクリプトでは使ったことないですが、
ちょこっと調べたのでついでに記載。
switch文は、評価対象(下の例だとflag)を先に書いて、
正しいcaseに飛んで、breakでswitch文を抜ける。
つまり、breakの記述がないと、alert("1だよ")、alert("2だよ")
alert("1でも2でもないよ");と全部出るちゃいます。
[iscript] var flag = 1; switch ( flag ) { case 1 : alert("1だよ"); break; case 2 : alert("2だよ"); break; default : alert("1でも2でもないよ"); break;} [endscript]
■結局何が言いたい?
if文だけでも、elseを混ぜても同じ結果にはできます。
挙動が想定通りにならない場合は、たぶんちょっと複雑なことをしてるはずなので、
上から追って行って、どこでおかしくなっているか絞ることと、
どんな動きをする物を使ってるのか正しく理解するとよいですね。
動けばいいか。となんとなく使っていると、
後で苦しむのは自分なのである……