美文网首页Dart
Dart - 函数(词法闭包、函数对象相等和返回值)

Dart - 函数(词法闭包、函数对象相等和返回值)

作者: LouisXWB | 来源:发表于2019-12-13 13:16 被阅读0次

    词法闭包

    闭包 即一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问在它词法作用域内的变量。

    函数可以封闭定义到它作用域内的变量。接下来的示例中,函数 makeAdder()捕获了变量 addBy。无论函数在什么时候返回,它都可以使用捕获的addBy 变量。

    /// 返回一个将 [addBy] 添加到该函数参数的函数。
    /// Returns a function that adds [addBy] to the
    /// function's argument.
    Function makeAdder(num addBy) {
      return (num i) => addBy + i;
    }
    
    void main() {
      // 生成加 2 的函数。
      var add2 = makeAdder(2);
    
      // 生成加 4 的函数。
      var add4 = makeAdder(4);
    
      assert(add2(3) == 5);
      assert(add4(3) == 7);
    }
    

    支持多个括号的连续调用:

    Function generateFunc(int i){
        return (item)=> item+i;
      }
      
      var func = generateFunc(100);
      print(generateFunc(100)(10000));
    

    测试函数是否相等

    函数既然是对象,也可以比较是否相等:

    void foo() {} // 定义顶层函数 (A top-level function)
    
    class A {
      static void bar() {} // 定义静态方法
      void baz() {} // 定义实例方法
    }
    
    void main() {
      var x;
    
      // 比较顶层函数是否相等。
      x = foo;
      assert(foo == x);//true
    
      // 比较静态方法是否相等。
      x = A.bar;
      assert(A.bar == x);//true
    
      // 比较实例方法是否相等。
      var v = A(); // A 的实例 #1
      var w = A(); // A 的实例 #2
      var y = w;
      x = w.baz;
    
      // 这两个闭包引用了相同的实例对象,因此它们相等。
      assert(y.baz == x);//true
    
      // 这两个闭包引用了不同的实例对象,因此它们不相等。
      assert(v.baz != w.baz);//true
    }
    

    返回值

    所有的函数都有返回值。没有显示返回语句的函数最后一行默认为执行 return null。

    foo() {}
    
    assert(foo() == null);
    

    相关文章

      网友评论

        本文标题:Dart - 函数(词法闭包、函数对象相等和返回值)

        本文链接:https://www.haomeiwen.com/subject/bujfnctx.html