evalってなんぞ?
1回目からマニアな領域へ(゜□゜)こんにちはヨウスケです。
eval。見た事無い。見た事あるけど使った事無い。
その便利さゆえに付きまとう使い方の解りにくさ。非常に可哀想な存在です。
・・・どうパターン化して書いていこうか迷走しながらの執筆ですので、お付き合い宜しくお願いします。
eval
読み方解りません。「イーバル」とか言ってます。かっこつける時は「イーヴァル」。
意味は『文字列をターゲットに変換してくれるもの』と考えています。ターゲット、というのは、インスタンス名とか変数、プロパティなど、スクリプトで指示する時に書く英語の文字列の事で
a = 1 の 『a』とか
MC1.animation.gotoAndPlay(2) の 『MC1.animation』とかがそうです。
例として、ムービークリップを10個用意し、それぞれにmc1,mc2・・・mc10というインスタンス名が連番で付いているとします。これらを一気に10フレーム目から再生させたい、という時、普通に書くと
mc1.gotoAndPlay(10); mc2.gotoAndPlay(10); ・ ・ ・ mc10.gotoAndPlay(10);
と10行のスクリプトを書きますが、これが100個あったり1000個あったらたまりません。
こんな時にevalをforループの中で使ってやる事で、楽に操作ができます。
var firstCount = 1; //連番になっているMC名の最初の数字 var maxCount = 10; //ループさせたい回数 for(var count = firstCount; count <= maxCount; count++){ eval("mc" + count).gotoAndPlay(10); }
*
調子に乗って、a1〜a10までの引数に0〜99の範囲でランダムに値を入れていく、という処理を作りましたが、下記のスクリプトではどうも動いてくれませんでした。
var firstCount = 1; //連番になっているMC名の最初の数字 var maxCount = 10; //ループさせたい回数 for(var count = firstCount; count <= maxCount; count++){ eval("a" + count) = random(100); }
んん〜?エラーメッセージを簡単に書くと
『イコールの左っかわ(つまり eval("a" + count))が引数として扱えないから、他の物に変えてや〜』
という事だそうで(゜□゜)evalで囲まれた文字列を引数として扱う事が出来ませんでした。
setPropertyという値をセットするスクリプトもありますが、もっと簡単な方法は無いものか・・・と思いながらFLASHのヘルプを見てみた所、evalと同じ働きをする別の書き方が載っていました。それは・・・
this["a" + count]
という書き方。何故か括弧は ( ) じゃなくて [ ] です。お間違えなく。
つまりエラーの出たスクリプトを書き直すと以下のようになります。
var firstCount = 1; //連番になっているMC名の最初の数字 var maxCount = 10; //ループさせたい回数 for(var count = firstCount; count <= maxCount; count++){ this["a" + count] = random(100); }
これで、a1〜a10にランダムな値がちゃんと入りました(゜□゜)やたーぃ。
*
このeval()とthis[]、各々に使えない時と使える時があったり、エラーは出ていないのに値が入っていないとか動作しない、とか、結構苦しむケースが多いようです。
もう、こういう時は「使える時だけ使う」の持論にのっとり(汗、こんな感じで場合分けをしてみました。
eval("色んな引数を含む文字列") : ムービークリップのインスタンス名を作る時に用いる
this["色んな引数を含む文字列"] : 変数名を作る時に用いる
色んな引数を含む文字列で最終的に作りたいものがなんなのか、という事を基準にすると、どっちを使うべきか自ずと見えてきます。
例として、MCの中の変数を処理したいんだけど・・・という場合は、後者を選び
this[この中で、MC名.変数名 という文字列を作りましょう] = 入れたい値
と、こんな具合にしてもらえれば、動作すると思います・・・多分(汗
(゜□゜; )お、おしまい!(笑
カテゴリ
なんぞ?トラックバック(0)
このブログ記事を参照しているブログ一覧: evalってなんぞ?
このブログ記事に対するトラックバックURL: http://graphicker.jp/flextime/blog/cgi-bin/mt-tb.cgi/87
コメントする