4

実行時に ActionScript 3 の無名関数のシグネチャを確認する方法はありますか?

他の関数に引数として渡されたオブジェクトを検証Functionし、それらが正しい数の引数 (正しい型) を受け入れ、正しい型の値を返すことを確認したいと思います。

flash.utils.describeType()無名関数の場合、この情報は返されないようです。

4

2 に答える 2

4

ランタイムが無名関数を反映できるようには見えませんが、これは残念です。

無名関数は (おそらく定義により) としてマークされdynamicます。互換性のない型を無名関数に渡しても、エラーはスローされません。型の不一致は、可能な限り黙ってキャストされます。たとえば、パラメーター"minotaur"としてのようなものを渡すと、 (ゼロ) が生成されます。uint0

本当にオーバーエンジニアリングしたい場合は、すべての OO を取得できます。無名関数を受け入れる代わりに、適切な関数シグネチャを含むインターフェイスを宣言し、そのインターフェイスを実装するオブジェクトを受け入れることができます。

public interface IFancyCallback {
  public function fancyFunction(frog:Frog, princess:Girl):UsefulReturnType;
}

そして、関数をオブジェクトにパッケージ化するだけで済みます:

public class ConcreteCallback implements IFancyCallback {
  public function fancyFunction(frog:Frog, princess:Girl):UsefulReturnType {
    princess.kiss(frog);
    return new UsefulReturnType("jabberwocky");
  }
}

多くのコード オーバーヘッドが発生する可能性があります。持つ予定のコールバックの数、作成者、anon 関数の署名が間違っていた場合の深刻度によって異なります。

あなたが解決しようとしている問題について、もっと教えていただけますか?

于 2008-12-08T03:13:14.307 に答える
1

大まかな概算として、長さプロパティを使用してパラメーターの数を確認できます。たとえば、次のようになります。

function doStuff(callback:Function) {
  trace(callback.length);
}

無名関数の引数を列挙する方法を知りません。もちろん、ArgumentError をキャッチした後で検証することもできます。

于 2008-12-02T16:09:26.600 に答える