evalってなんぞ?

| | コメント(0) | トラックバック(0)

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

コメントする

このブログ記事について

このページは、ヨウスケが2008年4月 2日 20:01に書いたブログ記事です。

ひとつ前のブログ記事は「はじめに」です。

次のブログ記事は「改行コードってなんぞ?」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.1