测试Dart值是否实际上是一个函数?

时间:2014-03-25 10:33:34

标签: function types dart

是否可以测试值是否是可以调用的函数?我可以轻松地测试null,但之后我不知道如何确保传入的参数实际上是一个函数?

void myMethod(funcParam)
{
   if (funcParam != null)
   {
       /* How to test if funcParam is actually a function that can be called? */
       funcParam();
   }
}

3 个答案:

答案 0 :(得分:6)

void myMethod(funcParam) {
    if(funcParam is Function) {
        funcParam();
    }
}

当然,只有当参数列表匹配时,对funcParams()的调用才有效 - is Function没有检查。如果涉及参数,可以使用typedefs来确保这一点。

typedef void MyExpectedFunction(int someInt, String someString);

void myMethod(MyExpectedFunction funcParam, int intParam, String stringParam) {
    if(funcParam is MyExpectedFunction) {
        funcParam(intParam, stringParam);
    }
}

答案 1 :(得分:3)

  var f = () {};
  print(f is Function); // 'true'

  var x = (x){};
  print(x is Function); // 'true'

答案 2 :(得分:3)

在您的情况下,您想要检查是否可以使用零参数调用该函数。

typedef NullaryFunction();

main () {
  var f = null;
  print(f is NullaryFunction);  // false
  f = () {};
  print(f is NullaryFunction);  // true
  f = (x) {};
  print(f is NullaryFunction);  // false
}

如果您只是想知道它是某种功能,可以使用... is Function进行测试。所有可调用对象都实现了Function,但在技术上可行(尽管通常没有用)手动实现Function而不实际可调用。对于通过noSuchMethod模拟可训练性的对象来说,它确实有意义。