【问题标题】:Test if a Dart value is actually a function?测试 Dart 值是否真的是一个函数?
【发布时间】:2014-05-03 03:13:02
【问题描述】:

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

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

【问题讨论】:

    标签: function types dart


    【解决方案1】:
    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);
        }
    }
    

    【讨论】:

    • 你为什么认为is Function 只能在没有参数的情况下工作?
    • @GünterZöchbauer is Function 工作正常,但如果参数不匹配,对 funcParam() 的调用将失败。
    【解决方案2】:

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

    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 模拟可调用性的对象来说,这确实是一种意义。

    【讨论】:

      【解决方案3】:
        var f = () {};
        print(f is Function); // 'true'
      
        var x = (x){};
        print(x is Function); // 'true'
      

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2016-11-16
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多