有人可以解释一下这段代码吗?

时间:2020-01-16 13:26:44

标签: dart

我刚刚开始进行dart语言之旅,发现这段代码对我而言实际上没有任何意义,请有人解释一下

void main() {
  var callbacks = [];
  for (var i = 0; i < 2; i++) {
    callbacks.add(() => print(i));
  }
  callbacks.forEach((c) => c());
}

还在我使用print(callbacks)尝试该块的过程中,它刚给了我[Closure 'main_closure', Closure 'main_closure']

1 个答案:

答案 0 :(得分:3)

它创建一个列表。它循环运行两次,每次创建一个函数并将该函数添加到列表中。然后,它将遍历列表中的函数并调用每个函数。

为了便于阅读,为了简洁起见,我们尝试重写此代码:

void main() {
  var callbacks = <void Function()>[]; // Create an empty list of functions.
  for (var i = 0; i < 2; i++) {        // for i being 0 or 1:
    void f() {                         //  Create a function f
      print(i);                        //   which prints `i` when it's called
    }
    callbacks.add(f);                  //  Put function f into the callbacks list.
  }
  for (var c in callbacks) {           // For each function c in `callbacks`:
    c();                               //  Call the function c
  }
}

此代码实际上与原始代码相同,只是类型检查和语法较少。

主要区别在于原始语言中使用的语法省略了许多类型(这使它们成为dynamic,因此代码没有类型检查),并且包含函数表达式: *表达式() => print(i)是一个匿名函数表达式。它求值的函数值等于命名函数声明void f() { print(i); }的函数值,只是没有名称或返回类型,它对主体使用=>,可以因为身体是一个单一的表达。 *表达式(c) => c()也是一个匿名函数表达式。在这种情况下,它等效于类似void callIt(void Function() f) { f(); }的声明。 List.forEach期望使用这样的函数作为参数,并依次使用列表的每个元素来调用它。

(此示例的目的是显示在两次循环迭代期间捕获的i变量在每次循环中都是不同的变量。)