AS3ではeval関数が使えない。
javaScript感覚でeval()が使えると思ったら、
【AS3ではeval()が使えない】
こんな記事が見つかった。
え〜。消す意味が分からないよ!
とびっくりした。
で、eval関数を使えるライブラリやら、JavaScriptを使用して使えるようにする方法などいろいろあったが、
どうやら以下のようにすることで、eval()と同じようなことができるようだ。
≪JavaScript≫
eval("cstColorSelect" + 1);
≪AS3≫
this["cstColorSelect" + "1"]
言語によって書き方変わるのはよくあることだけど、
肝心なことは統一してよ!
で、さっき作った5つのカラー配色できるFlashに、
色数によって選択できる【ColorSelect】を規制するように修正した。
ColorSelectに規制をかけるサンプル

で、なぜeval関数が使えないと嘆く羽目になるのかというと
【eval関数もどきをつかった関数】
[定数の値]
ConstColor.MIN_SELECT_NUM = 1
ConstColor.MAX_SELECT_NUM = 5
COLOR_SELECT_ID ="cstColorSelect"
// カラー数を引数に渡すとColorSelectに規制をかけてくれる
private function enableColorSelect(colorNum:uint):void
{
try {
Logger.debug("enableColorSelect:Start");
// カラー数によって選択できるColorSelectを規制する
//
// ※)カラー数以下 :規制をかけない
// カラー数より大きい:規制をかける
//
for (var i:int = ConstColor.MIN_SELECT_NUM;
i <= ConstColor.MAX_SELECT_NUM;
i++)
{
// カラー数によって規制をかける
if (i <= colorNum )
{
// カラー数以下:規制をかけない
this[COLOR_SELECT_ID + i.toString()].enabled = true;
} else {
// カラー数より大きい;規制をかける
this[COLOR_SELECT_ID + i.toString()].enabled = false;
}
}
Logger.debug("enableColorSelect:End");
} catch (e:Error)
{
throw(e);
}
}
【eval関数もどきが使えない場合】
// カラー数を引数に渡すとColorSelectに規制をかけてくれる
private function enableColorSelect(colorNum:uint):void
{
try {
Logger.debug("enableColorSelect:Start");
if (colorNum <= 5) {
cstColorSelect5.enabled = true;
} else {
cstColorSelect5.enabled = false;
}
if (colorNum <= 4) {
cstColorSelect4.enabled = true;
} else {
cstColorSelect4.enabled = false;
}
if (colorNum <= 3) {
cstColorSelect3.enabled = true;
} else {
cstColorSelect3.enabled = false;
}
if (colorNum <= 2) {
cstColorSelect2.enabled = true;
} else {
cstColorSelect2.enabled = false;
}
if (colorNum <= 1) {
cstColorSelect1.enabled = true;
} else {
cstColorSelect1.enabled = false;
}
Logger.debug("enableColorSelect:End");
} catch (e:Error)
{
throw(e);
}
}
eval関数もどきを使った場合と、使わなかった場合の大きな違いは、
【ColorSelect】の数が6つになった時にどうするの?
といったことに対応できるかどうかということだ、
eval関数もどきを使った場合は定数の値を変えるだけでいい
(ConstColor.MAX_SELECT_NUM = 6とする)
でも、使わなかった場合は
if (colorNum <= 6) {
cstColorSelect6.enabled = true;
} else {
cstColorSelect6.enabled = false;
}
と関数を変更しなくてはならない。
で、こんな変更が入るとコピペして
if (colorNum <= 6) {
cstColorSelect5.enabled = true;
} else {
cstColorSelect6.enabled = false;
}
と5個目の【ColorSelect】が変わるだけで、
一向に6個目が規制がかかった状態となってしまうような間違いを起こす。
極力関数を作成する場合は、中のロジックを変更することがないように作成しないと、
バグを連発する結果となるし、テストを再度行わなければならなくなる。
テクニックで何とかなる場合はできるだけシンプルにつくり、
必ず中で使用する数値や文字列は定数化しなければならない!
テーマ : Adobe Flex3
ジャンル : コンピュータ



