4

有没有办法在运行时查看 ActionScript 3 中匿名函数的签名?

我想验证Function作为参数传入其他函数的对象,并确保它们接受正确数量的参数(具有正确的类型)并返回正确类型的值。

flash.utils.describeType()似乎没有为匿名函数返回此信息。

4

2 回答 2

4

看起来运行时不允许您反映匿名函数,这是一种耻辱。

匿名函数(可能根据定义)标记为dynamic. 如果将不兼容的类型传递给匿名函数,则不会引发错误。任何类型的不匹配都会尽可能地被默默地强制转换。例如,将类似的东西"minotaur"作为uint参数传递将产生0(零)。

如果你真的想过度设计它,你可以得到所有的面向对象。您可以声明一个包含适当函数签名的接口,并接受实现该接口的对象,而不是接受匿名函数。

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 回答