我刚刚开始进行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']
答案 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
变量在每次循环中都是不同的变量。)