おとやすみ日記

ゲームプランナー、一児の父です。

Flash備忘録「引数の中で関数を実行? いやいや、そんなはずは…」

ものすごい基本的で単純なことを間違えて覚えていたので自戒の意味を込めてメモ。羞恥心はゼロでお送りいたします。


1) 引数nをtraceするだけの単純な関数"tracer"があったとしよう。

var num:Number = 100;

tracer = function(n:Number):Void {
 trace(n);
}

2) そして、引数内で"act"というfunctionを渡す関数"hoge"があったとする。
処理のイメージは、hoge関数内で関数actを実行する流れで。
(※すでにこの時点で勘違いしています)

function hoge(act:Function):Void {
 act;
 trace("引数act = " + act);// 出力結果 -> "引数act = undefined"
}

3) そして、hoge関数の引数に最初のtraceだけ出力する関数tracerを入れる。

hoge( tracer(num) );// trace出力 -> 100

さきほどのイメージでは、あくまでもhoge関数内の一行目でtracerが実行され、100という数字が出力されているイメージとなる。(※当然これも勘違い)

でも実際は、引数として入れられた時点でtracer(num);が実行されており、hoge関数内に引数としては渡っていない。


4) 証拠に、hoge関数内に引数actを出力するtrace文を入れた結果は下記のとおり。

function hoge(act:Function):Void {
 act;
 trace("引数act = " + act);// 出力結果 -> "引数act = undefined"
}

5) したがって、下記のコードでは、tracer(num)が実行されているが、traceの中身はundefinedになっている。

trace( tracer(num) );// -> undefined

4月1日にNHKで放送された「プロフェッショナル〜仕事の流儀〜」中村勇吾特集のとき、「バグで同じ処理が二回繰り返して実行されてしまい、文字が重なって表示されてしまった。→しかしそのバグからヒントを得て、重なる文字のアニメーションを思いついた」というくだりがありましたが、やってることの次元は違いますが原理は同じじゃないでしょうか?(笑)


まとめ:今回の恥ずかしい検証に使ったコード全文はこちら。

var num:Number = 100;

//traceだけ処理する関数hoge
tracer = function(n:Number):Void {
 trace(n);// -> 100
}

//引数内でactを実行する?関数hoge2
function hoge(act:Function):Void {
 act;
 trace("引数act = " + act);// 出力結果 -> "引数act = undefined"
}

hoge2( tracer(num) );


//したがって、下記のコードでは
//tracer(num)が実行されているが、
//traceの中身はundefinedになっている。

trace( tracer(num) );// -> undefined

これは今日、ペアプログラミングしてもらった際に教えてもらったことなんですが、非同期系アプリの開発時に書いていたコードであったにも関わらず、この部分は奇跡的にちゃんと動いていました。あぁ恐ろしい…!


思えば、初めて本格的に組んだFlashがサーバー連携必須な、ユーザー投稿型非同期処理系キャンペーンサイトでした。無謀にもXMLファイルのパースってどうやるんだ?というところからのスタート。当然、設計の仕方すらも全然わからないままで勢いだけで開発して、バグだらけでとにかく大変でした。その分得るものはものすごく大きかったんですが。
Flashを始めてもうすぐ二年。最近、ほかのFlasherにとっては当たり前のことが、なんだかごっそり抜けているような気がするので、今まで以上に頑張らないと(夏休みがない)なぁ…、なんて思う月曜日の深夜でした。