ひさし貸し母屋取られるelseかな
「ひさし(庇)を貸して母屋を取られる」ということわざがあります。[アクション]パネルの[自動フォーマット]をは、シンタックスをチェックしたり、フォーマットを整えてくれる便利な機能です。しかし、たまに余分なことをしてくれる場合があります。
図1のようなスクリプトとコメントを記述して、自動フォーマットを実行してみましょう。
図1■if/elseアクションにコメントを加えて[自動フォーマット]を実行
if/elseアクションのブロックを指定する中括弧({})の位置が、インデントとともに整えられます。このとき、elseアクションの直後に加えられていたコメントは、elseブロック({})の中に移動します。すると、元々elseブロック内に記述してあったステートメントが、その外に追いやられてしまいます(図2)。
図2■else直後のコメントがブロック内に移動すると同時、elseブロック内に記述されていたステートメントはブロック外に
もちろん、[自動フォーマット]後のスクリプトは、それ以前とは異なる動作になります。スクリプトとして意味はないはずのコメントが、構成要素であるステートメントの場所を乗取って追出してしまったのです。
自動フォーマットのスタイル変更
最初のやたら改行の多いスクリプトのスタイル自体が問題だということではありません[*1]。とくに他言語の経験者には、このスタイルを好む人もいます。Flash MXの[アクション]パネルでも、[自フォーマット]のスタイルは変更することが可能です(図3)。
図3■[アクション]パネルのオプションメニューから[自動フォーマットオプション]を選択すれば、スタイルの変更が可能
実際、[if、for、switch、with、while行のつぎに'{']と['}'とelseを同じ行に使用しない]のふたつのオプションにチェックを入れれば、冒頭のスクリプトと同じスタイルになります。指定したスタイルは、[自動フォーマットオプション]ダイアログの[プレビュー]で確認することができます。
他方、if条件の()の直後にコメントを入れると、[自動フォーマット]でシンタックスエラーになります。したがって、elseの直後にコメントを入れた場合も、本来はシンタックスエラーを返すべきなのでしょう。またその他の場合でも、[自動フォーマット]は、コメントをすべて行の先頭に移動してしまいます(スクリプトの動作を変えることはありません)。[自動フォーマット]を使用する場合は、コメントの位置には注意する必要があるでしょう。
[*1] Macromediaにとって、このようなスタイルやコメント位置が予想外だったとも考えられません。Flash MX 2004のmx.events.EventDispatcher.asには、つぎのようなスクリプトの記述があります(コメントは76行目)。
Flash MX 2004でも、このバグは修正されていません。したがって、このスクリプトに[自動フォーマット]を適用すれば、処理が不当に変更されることになります(英語版Trialによる確認)。
この記事へのコメント
●1.野中文雄(2003年11月17日 06:19)
Flash MX 2004 7.0.1日本語版で、修正されていました。