もう、なんで?というAS仕様に悩むこと2時間。
どうみてもロジックはあってるのに、ロジック通りの動作をしないという現象が起こって悩んでいたのです。次のような内容で。
1)
var myname:String = "tohsaki";
if(myname == "tohsaki")
{
trace("tohsaki desu");
}else (myname == "yamada")
{
trace("yamada desu");
}
実際にはこんなに単純ではないのだけど、まぁ要約するとこういうことでした。これを実行すると、
---
tohsaki desu
yamada desu
---
と両方のtrace文が実行されてしまいます。
頭の中で構築されているロジックではありえないことなんだけど、でも実際にそういう動作をしてしまうのです。困ったな~と思ってよくみたら、頭の中では「else if」のはずの「if」が抜けてるんです。
「else (myname == "yamada")」こんななってる。
文法としておかしいはずなのに、Flashのコンパイル通っちゃうんだよね。これ。
でさ、
2)
var myname:String = "tohsaki";
if(myname == "tohsaki"){
trace("tohsaki desu");
}else (myname == "yamada"){
trace("yamada desu");
}
こういうふうに「{」の位置が変わると、これはやっぱり、コンパイルエラーになるわけ。不思議だよね。
2)の動作が正しいんだけど、1)の書き方だと通っちゃう。
僕としては、もともとは2)のif文の書き方をするのだけど、FlashDevelopって1)に整形しちゃうんだよね。気持ち悪いし行数増えるから嫌いなんだけど、設定の変え方がわからないから放置しておいたら、こんな罠ですよ。だいぶ時間ロスした。
ちなみに、次みたいなのも昔よくやったんだけど、AS3になってから注意してくれるようになってありがたい。
3)
var myname:String = "tohsaki";
if(myname = "tohsaki"){
trace("tohsaki desu");
}else if(myname == "yamada"){
trace("yamada desu");
}
比較の「==」をタイポで「=」になってるってやつです。
これだと、「条件内の代入です。=ではなく==をですか?」という片言の日本語で注意してくれます。
ありがたいありがたい。
そんなわけでした。
みなさんもご注意を。