AS3の…(rest)パラメータにハマった
Action Script3から追加された「…(rest)パラメータ」にハマりました。
「…(rest)パラメータ」というのは、関数の引数が何個でもいいよーっていう凄く便利な代物なのですが、「…(rest)パラメータ」で受け取った値を「…(rest)パラメータ」を要求する関数に渡そうとして半日くらいはまっていました。
具体的にはこんな感じ。
function hogehoge(commnad: string, callback : function, … args) : void{
var con : NetConnection = new NetConnection();
con.connect(・・・);
var responder : Responder = new Responder(callback, this.onFault);
con.call(command, responder, args);
}
これでamfphp を使ってPHP側にデータを渡すと、なぜか「array型」になる。
もちろん、PHP側でarrayから取り出す方法もあるが、侍プログラマ的にはNG。
なぜなら、キッチリ解決しないとあとで使い回しができないからである。
まず解決策として思いついたのが、「argumentsオブジェクト」。
「con.call(commnad, responder, arguments[2]); 」とかやってみたら、
コンパイル時にエラー!
「未定義のプロパティ arguments へのアクセスです。」
ナンデヤネン(`^`)!!!
リファレンスをよく読んでみたら、「…rest パラメータを使用したときは、argumentsを使えません」
・・・なるほど。
いろいろと調べていると、「AS3: 「… (rest)」で受け取ったパラメータを他の関数にそのまま渡す」ってのを発見!
それによると、「applyを使え!」
OH! That’s great!!!
たしかに、それなら行けますよね!
ってことで、最終的にはこんな感じ。
function hogehoge(commnad: string, callback : function, … args) : void{
var con : NetConnection = new NetConnection();
con.connect(・・・);
var responder : Responder = new Responder(callback, this.onFault);
var params : Array = new Array();
params.push(command);
params.push(responder);
params.push.apply(params, args);
con.call.apply(con, params);
}
あー、解決してよかった!